STM32 новичку в ARM что к чему
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
[uquote="koeltrad",url="/forum/viewtopic.php?p=4229609#p4229609"]Я пытаюсь понять что за командами CMSIS происходит.[/uquote]Для этого достаточно посмотреть как это сделано в CMSIS. Ваш же код неправильный!
- Реклама
- Сообщения: 317
- Зарегистрирован: Ср дек 09, 2020 18:38:07
Почему неправильный? Светодиод на пине 12, порте D зажигается.
Тактирование включил, скорость выставил, На выход пин настроил.
ODR высокий уровень на пине настроил.
Тактирование включил, скорость выставил, На выход пин настроил.
ODR высокий уровень на пине настроил.
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
[uquote="koeltrad",url="/forum/viewtopic.php?p=4229609#p4229609"]Я пытаюсь понять что за командами CMSIS происходит.[/uquote]
В CMSIS нет никаких "команд". Применительно к адресам регистров имеет место быть простое ОПРЕДЕЛЕНИЕ КОНСТАНТ, которое позволяет препроцессору компилятора тупо заменить магические адреса на именованные константы. То есть на имена регистров из даташита. Поскольку регистры периферии организованы в структуры с базовым адресом домена и смещением, то вполне разумно было определить доступ к регистрам как указатель на структуру. Это никак не влияет на размер кода.
Добавлено after 4 minutes 44 seconds:
[uquote="koeltrad",url="/forum/viewtopic.php?p=4229609#p4229609"]уже есть железо.[/uquote]
Дело не в том, что у вас есть, а чем вы реально пользуетесь в дебаге. Есть смутное подозрение, что вы не подключились к ST-link-у девборды в среде, а продолжаете использовать симулятор.
В CMSIS нет никаких "команд". Применительно к адресам регистров имеет место быть простое ОПРЕДЕЛЕНИЕ КОНСТАНТ, которое позволяет препроцессору компилятора тупо заменить магические адреса на именованные константы. То есть на имена регистров из даташита. Поскольку регистры периферии организованы в структуры с базовым адресом домена и смещением, то вполне разумно было определить доступ к регистрам как указатель на структуру. Это никак не влияет на размер кода.
Добавлено after 4 minutes 44 seconds:
[uquote="koeltrad",url="/forum/viewtopic.php?p=4229609#p4229609"]уже есть железо.[/uquote]
Дело не в том, что у вас есть, а чем вы реально пользуетесь в дебаге. Есть смутное подозрение, что вы не подключились к ST-link-у девборды в среде, а продолжаете использовать симулятор.
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
[uquote="КРАМ",url="/forum/viewtopic.php?p=4229646#p4229646"]В CMSIS нет никаких "команд".[/uquote]Вообще говоря, есть. В CMSIS определено достаточно много команд процессора. Тот же NOP, например.
- Реклама
- Сообщения: 317
- Зарегистрирован: Ср дек 09, 2020 18:38:07
[uquote="VladislavS",url="/forum/viewtopic.php?p=4229644#p4229644"]volatile[/uquote]
А нужен ли в моём коде volatile?
У меня нет циклов где компилятор может оптимизировать код.
А нужен ли в моём коде volatile?
У меня нет циклов где компилятор может оптимизировать код.
Я выключил в настройках Update Target before Debugging может из за этого.КРАМ писал(а):Есть смутное подозрение, что вы не подключились к ST-link-у девборды в среде, а продолжаете использовать симулятор.
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
Причём тут циклы? Не, ну я же не могу запретить ходить по граблям и изобретать велосипед. Ваше право.
Спойлер
Код: Выделить всё
__BKPT(0);
GPIOA->BSRR = GPIO_BSRR_BS_0;
GPIOA->BSRR = GPIO_BSRR_BR_0;
__NOP();
bkpt 0x0000
mov.w r3, #1207959552 ; 0x48000000
movs r2, #1
str r2, [r3, #24]
mov.w r2, #65536 ; 0x10000
str r2, [r3, #24]
nop Код: Выделить всё
__BKPT(0);
*(uint32_t*)0x48000018 = GPIO_BSRR_BS_0;
*(uint32_t*)0x48000018 = GPIO_BSRR_BR_0;
__NOP();
bkpt 0x0000
mov.w r3, #1207959552 ; 0x48000000
mov.w r2, #65536 ; 0x10000
str r2, [r3, #24]
nop
Последний раз редактировалось VladislavS Вт май 10, 2022 18:46:07, всего редактировалось 3 раза.
- Сообщения: 362
- Зарегистрирован: Вс апр 03, 2022 07:01:29
*((uint32_t*)(0x40020C00))|=1<<24;
А то был у меня один товарисчь, который упорно не желал учить язык Си, а пытался прогать СТМки на ассемблере. Когда 32F103 мучил, это еще бы ничего. А потом загорелся он 32H750 на асме ковырять - эт ваще атас. Постоянно донимал меня вопросами, какое смещение до регистра указывать. А я ж че, я на память цифер не помню, постоянно приходилось в мануалах адреса смотреть. Он пишет цифры, спрашивает, почему не работает. А это ведь надо залезть в мануал, посмотреть таблицу адресов, посмотреть номера битов, понять что не так и опять же перевести в цифры адресов и номеров битов... Пишешь на языке Си - не понимает, грит, рассказывай словами порядок действий. Вот и рассказываешь словами запись if(TIM15->SR & TIM_SR_UEV) ...
Так и здесь будет. На память цифры то мало кто запоминает.
[uquote="VladislavS",url="/forum/viewtopic.php?p=4229664#p4229664"]В CMSIS определено достаточно много команд процессора.[/uquote] Определены инструкции ядра в CMSIS, но никакие не "команды" CMSIS. И автор вопроса не NOP() имел ввиду. Речь не шла о встроенных инлайн функциях реализующих АСМ.
Добавлено after 8 minutes 5 seconds:
[uquote="koeltrad",url="/forum/viewtopic.php?p=4229677#p4229677"]А нужен ли в моём коде volatile?
У меня нет циклов где компилятор может оптимизировать код.[/uquote]
Вас это не должно волновать. Нужно просто писать код без разного рода граблей. И циклы тут вообще не причем. Если регистр не объявлен как volatile, то компилятор без всяких циклов вправе не читать его значение, а тупо брать последнее туда записанное в коде как неизмененную константу и без оптимизации. Компилятор ничего не знает про внешнюю модификацию регистров, если вы игнорируете volatile. Это особенно актуально с учетом того, что часть регистров данных периферии имеют один и тот же адрес при чтении и записи, хотя физически это разные регистры работающие либо с приемником данных, либо с передатчиком.
Добавлено after 8 minutes 5 seconds:
[uquote="koeltrad",url="/forum/viewtopic.php?p=4229677#p4229677"]А нужен ли в моём коде volatile?
У меня нет циклов где компилятор может оптимизировать код.[/uquote]
Вас это не должно волновать. Нужно просто писать код без разного рода граблей. И циклы тут вообще не причем. Если регистр не объявлен как volatile, то компилятор без всяких циклов вправе не читать его значение, а тупо брать последнее туда записанное в коде как неизмененную константу и без оптимизации. Компилятор ничего не знает про внешнюю модификацию регистров, если вы игнорируете volatile. Это особенно актуально с учетом того, что часть регистров данных периферии имеют один и тот же адрес при чтении и записи, хотя физически это разные регистры работающие либо с приемником данных, либо с передатчиком.
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
[uquote="КРАМ",url="/forum/viewtopic.php?p=4229721#p4229721"]Определены инструкции ядра в CMSIS, но никакие не "команды" CMSIS.[/uquote]Не только. Есть полезные макросы, есть функции для работы с контроллером прерываний, системным таймером и т.д. Ту же функцию вызывающую ресет контроллера почему бы "командой" не назвать? Просто не надо буквоедствовать не по месту.
- Сообщения: 317
- Зарегистрирован: Ср дек 09, 2020 18:38:07
[uquote="НовыйДень",url="/forum/viewtopic.php?p=4229707#p4229707"]Он пишет цифры, спрашивает, почему не работает.[/uquote]
В этом случае я пользуюсь программой STM32 ST-LINK Utility и смотрю состояние битов в регистрах.
Да, конечно, это только на начальном этапе делаю чтоб понять как всё работает.
В этом случае я пользуюсь программой STM32 ST-LINK Utility и смотрю состояние битов в регистрах.
Да, конечно, это только на начальном этапе делаю чтоб понять как всё работает.
[uquote="НовыйДень",url="/forum/viewtopic.php?p=4229707#p4229707"]ну в принципе, после раскручивания всех дефайнов в заголовочнике, так раз в конечном счете почти так и получается.[/uquote]
Почему "почти"? Точно так и получается.
Вот определение ЛЮБОГО порта.
Добавлено after 6 minutes 24 seconds:
[uquote="VladislavS",url="/forum/viewtopic.php?p=4229728#p4229728"]Просто не надо буквоедствовать не по месту.[/uquote]
Как раз В ДАННОМ СЛУЧАЕ это очень по месту. Еще раз, автор вопроса имел ввиду совершенно другие "команды". Только поэтому я и прокомментировал таким образом.
Почему "почти"? Точно так и получается.
Вот определение ЛЮБОГО порта.
Код: Выделить всё
typedef struct
{
__IO uint32_t MODER; /*!< GPIO port mode register, Address offset: 0x00 */
__IO uint32_t OTYPER; /*!< GPIO port output type register, Address offset: 0x04 */
__IO uint32_t OSPEEDR; /*!< GPIO port output speed register, Address offset: 0x08 */
__IO uint32_t PUPDR; /*!< GPIO port pull-up/pull-down register, Address offset: 0x0C */
__IO uint32_t IDR; /*!< GPIO port input data register, Address offset: 0x10 */
__IO uint32_t ODR; /*!< GPIO port output data register, Address offset: 0x14 */
__IO uint32_t BSRR; /*!< GPIO port bit set/reset register, Address offset: 0x1A */
__IO uint32_t LCKR; /*!< GPIO port configuration lock register, Address offset: 0x1C */
__IO uint32_t AFR[2]; /*!< GPIO alternate function low register, Address offset: 0x20-0x24 */
__IO uint32_t BRR; /*!< GPIO bit reset register, Address offset: 0x28 */
} GPIO_TypeDef;
#define __IO volatile
#define PERIPH_BASE 0x40000000UL
#define AHB2PERIPH_BASE (PERIPH_BASE + 0x08000000UL)
#define GPIOA_BASE (AHB2PERIPH_BASE + 0x00000000UL)
#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)
[uquote="VladislavS",url="/forum/viewtopic.php?p=4229728#p4229728"]Просто не надо буквоедствовать не по месту.[/uquote]
Как раз В ДАННОМ СЛУЧАЕ это очень по месту. Еще раз, автор вопроса имел ввиду совершенно другие "команды". Только поэтому я и прокомментировал таким образом.
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
[uquote="КРАМ",url="/forum/viewtopic.php?p=4229737#p4229737"]Почему "почти"?[/uquote]volatile
[uquote="VladislavS",url="/forum/viewtopic.php?p=4229742#p4229742"]volatile[/uquote]
Не, я имел ввиду, что абсолютный адрес и обращение через указатель на структуру дадут идентичный результат. Про volatile я уже все сказал. Его обязательность в любом случае не обсуждается.
Не, я имел ввиду, что абсолютный адрес и обращение через указатель на структуру дадут идентичный результат. Про volatile я уже все сказал. Его обязательность в любом случае не обсуждается.
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Это часом не Ассемблер с ЛОРа или pcmax с Киберфорума или stm64 с Изиэлектроникса?А то был у меня один товарисчь, который упорно не желал учить язык Си, а пытался прогать СТМки на ассемблере. Когда 32F103 мучил, это еще бы ничего. А потом загорелся он 32H750 на асме ковырять - эт ваще атас.
- Сообщения: 362
- Зарегистрирован: Вс апр 03, 2022 07:01:29
Скорее всего, он. Я не знаю, почему этот товарисчь нивкакую не желает изучить Си и использовать отладчик, а пишет на асме в слепую. Ну вот представляете, насколько сложно объяснять последовательность действий и разбирать его косяки на уровне словесного описания и чисел с адресами регистров и номерами битов. И совсем не понятно было, почему знакомство с H750 он начал с того, как записать "число во флеш через DMA". Причем, одно! одно число. Через DMA. Во флеш! на H750. Блин, если он начнет ковыряться с каким-нить USB на асме, я сойду с ума 
Вероятно, это какой-то особый изощренный способ самоистязания - H750 на ассемблере вслепую.
Вероятно, это какой-то особый изощренный способ самоистязания - H750 на ассемблере вслепую.
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
НовыйДень, про С - да, согласен: на асме портянки будут уж больно длинными, лучше на С или С++ код писать.
А вот про отладчик я категорически не согласен. Любой желающий может посмотреть, сколько всего у меня на гитхабе валяется. И все 100% моего кода отлаживались старыми добрыми способами, без этих ваших новомодных gdb или valgrind (ни тем, ни другим никогда не пользовался и не собираюсь).
Кстати, про CMSIS: там много чего полезного есть, но почему-то забыли про TRUE, FALSE и NULL! Так что приходится их в своих заголовочных файлах определять…
А вот про отладчик я категорически не согласен. Любой желающий может посмотреть, сколько всего у меня на гитхабе валяется. И все 100% моего кода отлаживались старыми добрыми способами, без этих ваших новомодных gdb или valgrind (ни тем, ни другим никогда не пользовался и не собираюсь).
Кстати, про CMSIS: там много чего полезного есть, но почему-то забыли про TRUE, FALSE и NULL! Так что приходится их в своих заголовочных файлах определять…
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Я на гитхабе, в ЖЖ
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4230135#p4230135"]но почему-то забыли про TRUE, FALSE и NULL! Так что приходится их в своих заголовочных файлах определять…[/uquote]Что, всё так запущено? Compiler Exploer.
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Это-то еще нормально. Просто начинать надо с начала - простой контроллер, простые задачи. Если уж хочется ARM, то f103. И программы соответственно мигалка диодом, UART (чтобы хоть какая-то вменяемая отладка была), таймеры, прерывания. Примерно на этом этапе портянки станут достаточно длинными чтобы появилось желание уйти на Си.почему этот товарисчь нивкакую не желает изучить Си и использовать отладчик, а пишет на асме в слепую.
Но тот Ассемблер с ЛОРа сначала полез в bitband, потом еще куда-то, потом нашел где-то H7 и пытался его прошить (зачем, если и возможностей f103 ему пока за глаза?!), какие-то экзотические режимы АЦП. Чтение документации? Не, это слишком сложно, проще по форумам побираться!
- Сообщения: 1378
- Зарегистрирован: Вт ноя 19, 2019 06:10:18
Хе, вот как выглядит прочитать входные сигналы с MCP23008 и записать выходные на FBD. Тут всё как на ладони. И отладчик не нужен 
- Вложения
-
- Screenshot_393.jpg
- (34.72 КБ) 82 скачивания


