Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
95 / 15 / 3
Регистрация: 09.07.2009
Сообщений: 886

Работа с Keil начинающего освоение программирования STM32

08.06.2025, 21:24. Показов 10946. Ответов 164
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Пытаюсь освоить программирование STM32 по книге "Освоение STM32 самостоятельно". У меня установлена версия uVision 5.38.0.0. В книге на рис. 52 и 53 показано окно с заголовком "Contex M Target Driver Setup". Подскажите, пожалуйста, через какие пункты меню Keil можно вызвать это окно. Прикрепил скриншот проекта и интерфейса Keil
Миниатюры
Работа с Keil начинающего освоение программирования STM32  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.06.2025, 21:24
Ответы с готовыми решениями:

Книги "Освоение STM32 самостоятельно. Практическое руководство" без #, c #1 и #2 в названии
Здравствуйте! На Озоне появились книги с одинаковым названием, но разные по переплету и количеству...

Сравнить программные продукты Keil uVision 5.11.2.0 и Keil ARM 5.29.0.0
прив! программные среды разработки Keil uVision 5.11.2.0 и Keil ARM 5.29.0.0 это просто разные ...

STM32 + KEIL. Найти смещение функции в прошивке
Привет, коллеги! Столкнулся с проблемой - надо найти адрес и размер функции, а также все что к...

164
20.06.2025, 12:21
Студворк — интернет-сервис помощи студентам

Не по теме:

Цитата Сообщение от tumanovalex Посмотреть сообщение
которое должно получать аналоговый сигнал, сравнивать с минимальным и максимальным значением и устанавливать 0 или 1 на определенных контактах в зависимости от результатов сравнения.
А не проще было элементарный компаратор использовать? Вообще ни строчки кода не пришлось бы писать…

0
20.06.2025, 12:40

Не по теме:

попросили меня друзья сделать АЦП на STM32
Да уж..
За ради ацп с компаратором нужно стм32 осваивать..
Хорошо что у меня друзей нет :) :)

0
Эксперт .NET
 Аватар для Rius
13405 / 7858 / 1701
Регистрация: 25.05.2015
Сообщений: 23,870
Записей в блоге: 14
20.06.2025, 13:04
Смотрите на это иначе: вот сейчас он из пушки по воробьям научится срелять, а завтра ему предложат работу, которую он сможет этой самой пушкой выполнить на раз-два, а не париться с низким уровнем, который там уже будет не очень.
Например, данные в цифровом виде вывести по uart/can/usb/hart.
0
95 / 15 / 3
Регистрация: 09.07.2009
Сообщений: 886
20.06.2025, 13:19  [ТС]
Rius, wizard41, спасибо большое за скриншоты. У меня основной файл находился в директории
C
1
D:\Keil_v5_trial\ARM\Packs\Keil\STM32F1xx_DFP\2.4.1\Device\Include\stm32f10x.h
Он подключился в проект с кодом из книги из этой директории (делал все по книги, по разделу "4.2 ПИШЕМ РАБОЧУЮ ФУНКЦИЮ RCC С ЧАСТОТОЙ РАБОТЫ В 72МГЦ"). В папке проекта этого файла нет (архив проекта прикрепил), а в настройках проекта Define пустой и директории с заголовочными файлами не включены. В директории D:\Keil_v5_trial файл stm32f1xx_hal.h поиском Total Commander я не нашел. Может быть нужно доустановить какой-то пакет и что-то изменить в настройках проекта, чтобы этот файл можно было включить в программу? Помогите, пожалуйста.
Вложения
Тип файла: zip stmKeilBook.zip (131.0 Кб, 6 просмотров)
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3460 / 2781 / 575
Регистрация: 04.09.2018
Сообщений: 8,743
Записей в блоге: 3
20.06.2025, 13:29
Лучший ответ Сообщение было отмечено tumanovalex как решение

Решение

tumanovalex, да просто тут все. Последовательность такая:
Идешь на сайт ST (если есть VPN) и качаешь от туда библиотеку вида "STM32Cube_FW_F4_V1.27.0". Если впн-а нет, то они валяются много где, в т.ч. на гитхабах.. Вместо "F4" в названии у тебя будет "F1".

Все что нужно, будет лежать в папках внутри - закидывай CMSIS и папку Driver в свой проект и добавляй пути поиска:

Кейл все это хавает на ура, несмотря на то, что библа по названию вроде как для Куба..
1
Эксперт .NET
 Аватар для Rius
13405 / 7858 / 1701
Регистрация: 25.05.2015
Сообщений: 23,870
Записей в блоге: 14
20.06.2025, 13:37
Она входит в состав куба и устанавливется им. Но в конце концов это просто исходники, которые собираются тем же gcc.
Если не пользоваться кодогенератором проектов куба, то может понадобиться вручную передать дефайны компилятору, типа включения hal или указания чипа.
1
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3460 / 2781 / 575
Регистрация: 04.09.2018
Сообщений: 8,743
Записей в блоге: 3
20.06.2025, 13:40
Rius, да, просто чтобы начинающие не ударялись в панику, видя в названии Cube...
Для кейла тоже есть библиотеки отдельные, но именно HAL'овские лучше брать от куба.
0
 Аватар для COKPOWEHEU
4146 / 2724 / 433
Регистрация: 09.09.2017
Сообщений: 12,070
20.06.2025, 13:44
Цитата Сообщение от Eddy_Em Посмотреть сообщение
ADC1->CHSELR
Что-то не увидел такого ни в f103, ни в l151. И в ch32 ничего похожего не было. Как вашим кодом пользоваться-то?
Хотя в u5 он есть. Возможно, придется осваивать новую реализацию АЦП, печально.
Цитата Сообщение от tumanovalex Посмотреть сообщение
Приведенный код я брал из книги "Освоение STM32 самостоятельно", просто нужно было с чего-то начать.
Все правильно. Воспринимайте критику как направление что еще можно улучшить.
Цитата Сообщение от Eddy_Em Посмотреть сообщение
которое должно получать аналоговый сигнал, сравнивать с минимальным и максимальным значением и устанавливать 0 или 1 на определенных контактах в зависимости от результатов сравнения.
А не проще было элементарный компаратор использовать? Вообще ни строчки кода не пришлось бы писать…
Вот да. Задача-то под обычный аналоговый компаратор.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3460 / 2781 / 575
Регистрация: 04.09.2018
Сообщений: 8,743
Записей в блоге: 3
20.06.2025, 13:45
tumanovalex, нужно иметь в виду, что с HAL'ом вроде как писать легче, т.к. всю подноготную работу он берет на себя, но не будет понимания что конкретно происходит, и также он генерит много всякой лишней фигни.
Моргание светиком на чистом CMSIS-е будет раз в 5 меньше, чем та же прога на HAL-е.
0
Windows must die
610 / 883 / 104
Регистрация: 23.11.2021
Сообщений: 5,170
Записей в блоге: 19
20.06.2025, 14:16
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Что-то не увидел такого ни в f103, ни в l151.
Это ж для "нулевок", для "единичек" вот так:
C
1
2
3
4
    // sequence order: 0 -> 1 -> 5 -> 16 -> 17
    ADC1->SQR3 = 0 | (1<<5) | (5<<10) | (16<<15) | (17<<20);
    ADC1->SQR1 = (NUMBER_OF_ADC_CHANNELS - 1) << 20; // amount of conversions
    ADC1->CR1 |= ADC_CR1_SCAN; // scan mode
Добавлено через 1 минуту
Цитата Сообщение от wizard41 Посмотреть сообщение
Моргание светиком на чистом CMSIS-е будет раз в 5 меньше, чем та же прога на HAL-е.
И добиться хотя бы 6Мбод от USB на кале не получится…
0
 Аватар для COKPOWEHEU
4146 / 2724 / 433
Регистрация: 09.09.2017
Сообщений: 12,070
20.06.2025, 14:23
Цитата Сообщение от Eddy_Em Посмотреть сообщение
ADC1->SQR3 = 0 | (1<<5) | (5<<10) | (16<<15) | (17<<20);
То есть ваше решение не работает более чем для 5 каналов. Представьте, что каналов у вас 8. А потом выяснилось, что 4-й не нужен. Будете по SQR3, SQR2 руками ковыряться что ли?
И ведь с SMPR та же проблема. Какой-нибудь Vref или Tsensor это 16, 17 каналы, они уже не в SMPR2, как ADC0-ADC9, а в SMPR1.

Добавлено через 2 минуты
Цитата Сообщение от Eddy_Em Посмотреть сообщение
И добиться хотя бы 6Мбод от USB на кале не получится…
Ну, этим-то ТСа вряд ли напугаешь. Ему до USB еще учиться и учиться. Плюс сам USB используется далеко не в каждом устройстве, и максимальные скорости от него нужны довольно редко. А если уж нужны, то USB-FS в любом случае их толком не обеспечит даже с нормальным софтом.
0
Windows must die
610 / 883 / 104
Регистрация: 23.11.2021
Сообщений: 5,170
Записей в блоге: 19
20.06.2025, 14:27
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
То есть ваше решение не работает более чем для 5 каналов.
Очень даже работает, просто нужно еще и в следующий регистр данные закинуть. Элементарно ж!
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
А потом выяснилось, что 4-й не нужен. Будете по SQR3, SQR2 руками ковыряться что ли?
А почему бы и нет? Привык. Да и на это совсем немного времени тратится.
Ну, а вообще, 103-ю серию я обычно во всяких USB'шных делах использую, там, где АЦП чаще всего и не нужен. А для более сложных вещей выбираю более продвинутые F0x2 или F303. Возможно, когда-нибудь на G-серию перейду, но пока у меня сотня F103 и полсотни F072 в запасе, так что, ОК.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
static inline void adc_setup(){
    GPIOA->CRL |= CRL(0, CNF_ANALOG|MODE_INPUT) | CRL(1, CNF_ANALOG|MODE_INPUT) | CRL(5, CNF_ANALOG|MODE_INPUT);
    uint32_t ctr = 0;
    // Enable clocking
    RCC->APB2ENR |= RCC_APB2ENR_ADC1EN;
    RCC->CFGR &= ~(RCC_CFGR_ADCPRE);
    RCC->CFGR |= RCC_CFGR_ADCPRE_DIV8; // ADC clock = RCC / 8
    // sampling time - 239.5 cycles for channels 0, 1, 5, 16 and 17
    ADC1->SMPR2 = ADC_SMPR2_SMP0 | ADC_SMPR2_SMP1 | ADC_SMPR2_SMP5;
    ADC1->SMPR1 = ADC_SMPR1_SMP16 | ADC_SMPR1_SMP17;
    // sequence order: 0 -> 1 -> 5 -> 16 -> 17
    ADC1->SQR3 = 0 | (1<<5) | (5<<10) | (16<<15) | (17<<20);
    ADC1->SQR1 = (NUMBER_OF_ADC_CHANNELS - 1) << 20; // amount of conversions
    ADC1->CR1 |= ADC_CR1_SCAN; // scan mode
    // DMA configuration
    RCC->AHBENR |= RCC_AHBENR_DMA1EN;
    DMA1_Channel1->CPAR = (uint32_t) (&(ADC1->DR));
    DMA1_Channel1->CMAR = (uint32_t)(ADC_array);
    DMA1_Channel1->CNDTR = NUMBER_OF_ADC_CHANNELS * 9;
    DMA1_Channel1->CCR |= DMA_CCR_MINC | DMA_CCR_MSIZE_0 | DMA_CCR_PSIZE_0
                          | DMA_CCR_CIRC | DMA_CCR_PL | DMA_CCR_EN;
    // continuous mode & DMA; enable vref & Tsens; wake up ADC
    ADC1->CR2 |= ADC_CR2_DMA | ADC_CR2_TSVREFE | ADC_CR2_CONT | ADC_CR2_ADON;
    // wait for Tstab - at least 1us
    while(++ctr < 0xff) nop();
    // calibration
    ADC1->CR2 |= ADC_CR2_RSTCAL;
    ctr = 0; while((ADC1->CR2 & ADC_CR2_RSTCAL) && ++ctr < 0xfffff);
    ADC1->CR2 |= ADC_CR2_CAL;
    ctr = 0; while((ADC1->CR2 & ADC_CR2_CAL) && ++ctr < 0xfffff);
    // turn ON ADC
    ADC1->CR2 |= ADC_CR2_ADON;
}
Добавлено через 1 минуту
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Плюс сам USB используется далеко не в каждом устройстве
У кого как. У меня - наоборот, сложно найти устройство, где не было бы USB (в этом случае там есть CAN; но чаще всего присутствуют и CAN, и USB одновременно или же джампером можно выбрать - т.к. F103, увы, одновременно не умеют).
0
 Аватар для COKPOWEHEU
4146 / 2724 / 433
Регистрация: 09.09.2017
Сообщений: 12,070
20.06.2025, 14:35
Цитата Сообщение от Eddy_Em Посмотреть сообщение
Очень даже работает, просто нужно еще и в следующий регистр данные закинуть. Элементарно ж!
Руками. О чем я и говорю. А можно написать макрос, который сам выберет в какой регистр складывать номер канала.
Цитата Сообщение от Eddy_Em Посмотреть сообщение
А для более сложных вещей выбираю более продвинутые F0x2 или F303.
Так в f303 АЦП ближе к f103.
Цитата Сообщение от Eddy_Em Посмотреть сообщение
У кого как. У меня - наоборот, сложно найти устройство, где не было бы USB
У вас - да. У меня тоже. Но таких как вы все же меньшинство.
Цитата Сообщение от Eddy_Em Посмотреть сообщение
в этом случае там есть CAN
Вот постоянно слышу про этот CAN. Даже подумывал потыкать его палочкой. Но так и не нашел куда же его можно применить. Где вы находите устройства с CANом-то?!
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3460 / 2781 / 575
Регистрация: 04.09.2018
Сообщений: 8,743
Записей в блоге: 3
20.06.2025, 14:42
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
устройства с CANом-то?!
CAN - тема! Много где есть.
В моей практике, например, есть дешифраторы и усилители, которые управляются по CAN (всего два провода, вместо 6-ти для двоичного управления)..
В автомобилях, кстати, все узлы давно вяжут по CAN. Меньше проводов..
0
Эксперт .NET
 Аватар для Rius
13405 / 7858 / 1701
Регистрация: 25.05.2015
Сообщений: 23,870
Записей в блоге: 14
20.06.2025, 14:44
Он для автоотрасли и придуман...
0
Windows must die
610 / 883 / 104
Регистрация: 23.11.2021
Сообщений: 5,170
Записей в блоге: 19
20.06.2025, 14:49
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
А можно написать макрос, который сам выберет в какой регистр складывать номер канала.
На С++ лучше: там можно constexpr'ы и шаблоны. Я все жду, когда же в С завезут constexpr'ы. generic'и уже завезли, и можно "перегрузку" функций на макросах делать. Но вот, скажем, на стадии сборки подставить значения хэшей вместо строк - нельзя, поэтому приходится еще и велосипед городить в виде генератора case'ов под каждую команду (чтобы не вызывать уйму раз strcmp, а один раз хэш посчитать, да в case выбрать нужный вариант).
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Где вы находите устройства с CANом-то?!
Сам делаю. Очень удобная штука: не нужно всякие ублюдские модбасы городить, да и "мультимастер" - круто!
Ну, а еще есть всякие частотники на CAN, шаговики на CANopen и т.д., и т.п.

Добавлено через 30 секунд
Цитата Сообщение от wizard41 Посмотреть сообщение
В автомобилях, кстати, все узлы давно вяжут по CAN.
Последнее время почему-то чаще на LIN стали переходить…
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3460 / 2781 / 575
Регистрация: 04.09.2018
Сообщений: 8,743
Записей в блоге: 3
20.06.2025, 15:02
Цитата Сообщение от Eddy_Em Посмотреть сообщение
чаще на LIN стали переходить
Не уверен что прям "переходят". Дополняют им CAN - да. А чтоб полностью на LIN - не видел такого. Да и LIN не такой безопасный и надежный, как CAN.
0
Windows must die
610 / 883 / 104
Регистрация: 23.11.2021
Сообщений: 5,170
Записей в блоге: 19
20.06.2025, 15:09
Цитата Сообщение от wizard41 Посмотреть сообщение
Да и LIN не такой безопасный и надежный, как CAN.
Вот именно!
А CAN - идеальная штука. Конечно, всего-то 8 байт - длина фрейма, но нам же не "Войну и мир" по шине гонять?
Простейшая вещь в настройке, зато все "само" происходит, "под капотом": и арбитраж, и отлов коллизий, и проверка CRC… А в случае 232 или 485 нужно все это делать самому. Да еще и в случае 232/485 просто невозможно организовать псевдоодновременную отправку пакетов несколькими узлами, исключительно модель "запрос-ответ".
// кстати, уже неоднократно у рукожопых китайцев встречал такое, что на "широковещательный" модбас запрос (это когда адрес - нуль) устройство выдает данные! По спецификации устройства обязаны реагировать на эти запросы (например, выполнять команды), но должны молчать. У нас, например, 10 частотников должны одновременно стартовать/тормозить. Это возможно реализовать исключительно через широковещательные команды. А вот раньше был нормальный CAN {политика запрещена}, где у всех частотников был одинаковый ID на прием, и разные ID на передачу.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3460 / 2781 / 575
Регистрация: 04.09.2018
Сообщений: 8,743
Записей в блоге: 3
20.06.2025, 15:19
Цитата Сообщение от Eddy_Em Посмотреть сообщение
всего-то 8 байт - длина фрейма
Больше 2-3-х байт никогда еще не приходилось передавать (обмениваться). Так что 8 за глаза. Ну и действительно, этот протокол именно что для управления/получения данных состояний, а не для полномасштабного обмена километровыми посылками.
Единственный "минус", если можно так сказать - для него нужны спец. конвертеры (адаптеры, ИМС). То есть его нужно закладывать в плату сразу. На 232/485 можно организовать множество чего, не меняя при этом топологии и схемного решения.
Цитата Сообщение от Eddy_Em Посмотреть сообщение
"широковещательный" модбас запрос (это когда адрес - нуль) устройство выдает данные!
Ну это глюк конкретный. Прикольно наверное, когда все 10 слэйвов верещат в линию одновременно
0
Windows must die
610 / 883 / 104
Регистрация: 23.11.2021
Сообщений: 5,170
Записей в блоге: 19
20.06.2025, 15:21
Цитата Сообщение от wizard41 Посмотреть сообщение
Единственный "минус", если можно так сказать - для него нужны спец. конвертеры
Так и 232/422/485 без конвертеров не работает!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.06.2025, 15:21

STM32, Keil, передача массива в функцию
Использую uVision 4.60.00. Есть функция, которая выполняет расчёт контрольной суммы (CRC). Для её...

C++ в Keil + STM32
Доброго времени суток. Пытаюсь написать небольшой проектик на С++ под STM32 в Keil, но что то не...

CMSIS STM32 проект в Keil - это просто
Пишу небольшую обзорную статейку про CMSIS, это её часть ... Скачайте у ST последний HAL и...

Stm32 и Keil
Здравствуйте, помогите пожалуйста. Пытаюсь оценить ограничения Keilа. 32 кб этого хватит для таких...

STM32 и Keil v5 (5.14)
Всем доброго времени суток, я навичек в МК, прошу прощения, если выкладываю мысли слегка путано для...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
140
Ответ Создать тему
Новые блоги и статьи
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru