STM32 новичку в ARM что к чему

Кто любит RISC в жизни, заходим, не стесняемся.
Аватара пользователя
prinv
Вымогатель припоя
Сообщения: 677
Зарегистрирован: Чт янв 20, 2011 09:07:08
Откуда: Пермь
Контактная информация:

Re: STM32 новичку в ARM что к чему

Сообщение prinv »

Заново сгенерируйте проект Кубом - у вас заголовок отклеился :-)
Никакая контра не уйдёт от нас
Реклама
arkhnchul
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

Re: STM32 новичку в ARM что к чему

Сообщение arkhnchul »

из-за одного заголовочника перегенерировать проект, серьезно?)
Реклама
Аватара пользователя
prinv
Вымогатель припоя
Сообщения: 677
Зарегистрирован: Чт янв 20, 2011 09:07:08
Откуда: Пермь
Контактная информация:

Re: STM32 новичку в ARM что к чему

Сообщение prinv »

что за проблемы нажать кнопку в Кубе?
Никакая контра не уйдёт от нас
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32 новичку в ARM что к чему

Сообщение a5021 »

Вот объясните мне, либо я туплю, либо стм-ы, либо кто-то еще. :)

Дано: RM0091, стр. 741, описание регистра USARTx_ICR. Из описания явствует, что регистр работает только на запись. Запись единицы в конкретное битовое поле приводит к тому, что сбрасывается соответствующий бит в регистре статуса USARTx_ISR. Пишем в один регистр, биты сбрасываются в другом. Запись нуля ничего не меняет и ни к каким результатам не приводит. До этого момента все просто, понятно и логично. Непонятки начинаются с приложения А.19 (стр. 984), где приводятся примеры реализации некоторых режимов работы USART. Так вот в этих чудных примерах при манипуляциях с регистром USARTx_ICR везде используются конструкции вида:

Код: Выделить всё

USART1->ICR |= USART_ICR_TCCF; /* Clear transfer complete flag */
В этой строчке сначала происходит считывание регистра, потом операция логического "ИЛИ" с его значением, а затем запись результата обратно в регистр. Внимание, как говорится, вопрос: нахрена читать USART1->ICR, если известно, что он работает только на запись? Причем, эти обезьяны делают так везде: и в мануле и в кодснайпетах и пр. примерах. Это, типа, такой животный рефлекс у них выработался, что раз битовая запись, то обязательно через дизъюнкцию ? По другому никак? Зла не хватает.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
prinv
Вымогатель припоя
Сообщения: 677
Зарегистрирован: Чт янв 20, 2011 09:07:08
Откуда: Пермь
Контактная информация:

Re: STM32 новичку в ARM что к чему

Сообщение prinv »

[uquote="a5021",url="/forum/viewtopic.php?p=3432841#p3432841"]В этой строчке сначала происходит считывание регистра[/uquote]
Где вы видите чтение из регистра? :))
Какой в чтении смысл, если необходимо безусловно записать 1 в указанные биты?
Никакая контра не уйдёт от нас
Реклама
Аватара пользователя
Ярослав555
Поставщик валерьянки для Кота
Сообщения: 2081
Зарегистрирован: Пт май 31, 2013 17:14:38
Откуда: Украина, Винница

Re: STM32 новичку в ARM что к чему

Сообщение Ярослав555 »

[uquote="arkhnchul",url="/forum/viewtopic.php?p=3431701#p3431701"]из-за одного заголовочника перегенерировать проект, серьезно?)[/uquote]
если код писать в местах специально отведенных, между коментариев, то перегенерация проекта кубом не затрагивает Ваш код. Если вдруг не знали.
Реклама
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32 новичку в ARM что к чему

Сообщение a5021 »

[uquote="prinv",url="/forum/viewtopic.php?p=3432846#p3432846"]Где вы видите чтение из регистра? :))[/uquote]
Хорошая шутка. Вам ассемблерный дамп показать или на слово поверите?
Какой в чтении смысл, если необходимо безусловно записать 1 в указанные биты?
Если что, именно об этом я и спрашивал.
Аватара пользователя
prinv
Вымогатель припоя
Сообщения: 677
Зарегистрирован: Чт янв 20, 2011 09:07:08
Откуда: Пермь
Контактная информация:

Re: STM32 новичку в ARM что к чему

Сообщение prinv »

[uquote="a5021",url="/forum/viewtopic.php?p=3432855#p3432855"][uquote="prinv",url="/forum/viewtopic.php?p=3432846#p3432846"]Где вы видите чтение из регистра? :))[/uquote]
Хорошая шутка. Вам ассемблерный дамп показать или на слово поверите?[/uquote]
Я бы с дампа и начал.
Никакая контра не уйдёт от нас
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32 новичку в ARM что к чему

Сообщение a5021 »

Приветствую такой подход:

Код: Выделить всё

 835              	@ src/main.c:461:     while((USART1->ISR & USART_ISR_TC) != USART_ISR_TC) {
 836 0396 D369     		ldr	r3, [r2, #28]	@ _12, MEM[(struct USART_TypeDef *)1073821696B].ISR
 837 0398 1942     		tst	r1, r3	@ tmp518, _12
 838 039a FCD0     		beq	.L62	@,
 839              	@ src/main.c:464:     USART1->ICR |= USART_ICR_TCCF;    // clear TC flag
 840 039c 136A     		ldr	r3, [r2, #32]	@ _14, MEM[(struct USART_TypeDef *)1073821696B].ICR
 841 039e 1943     		orrs	r1, r3	@ _15, _14
 842 03a0 1162     		str	r1, [r2, #32]	@ _15, MEM[(struct USART_TypeDef *)1073821696B].ICR
Внимательно смотрим на строку дампа с номером 840.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: STM32 новичку в ARM что к чему

Сообщение VladislavS »

[uquote="a5021",url="/forum/viewtopic.php?p=3432841#p3432841"]Это, типа, такой животный рефлекс у них выработался, что раз битовая запись, то обязательно через дизъюнкцию ? По другому никак? Зла не хватает.[/uquote]Допускаю, что в каком-то чипе, ну может же быть такое, эти биты RW. Переписывать либы под каждый чип? Не индусский подход. :) Хотя, скорее всего, именно животный рефлекс. Пишите сами и с головой будет полный порядок.

[uquote="prinv",url="/forum/viewtopic.php?p=3432863#p3432863"]Я бы с дампа и начал.[/uquote]А я бы с учебника по С.
Последний раз редактировалось VladislavS Пн авг 06, 2018 11:25:28, всего редактировалось 1 раз.
Аватара пользователя
prinv
Вымогатель припоя
Сообщения: 677
Зарегистрирован: Чт янв 20, 2011 09:07:08
Откуда: Пермь
Контактная информация:

Re: STM32 новичку в ARM что к чему

Сообщение prinv »

[uquote="a5021",url="/forum/viewtopic.php?p=3432868#p3432868"]Внимательно смотрим на строку дампа с номером 840.[/uquote]
Век живи - век учись!
Правильнее будет писать просто
USART1->ICR = USART_ICR_TCCF;
Никакая контра не уйдёт от нас
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: STM32 новичку в ARM что к чему

Сообщение VladislavS »

[uquote="prinv",url="/forum/viewtopic.php?p=3432879#p3432879"]Век живи - век учись![/uquote]
Представляете, как будет удивлён индус, писавший это :)
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32 новичку в ARM что к чему

Сообщение a5021 »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3432874#p3432874"]Допускаю, что в каком-то чипе, ну может же быть такое, эти биты RW. Переписывать либы под каждый чип? Не индусский подход. :)[/uquote]
Какие либы, если разговор идет про RM ? Допущения, конечно, хорошо, но RM0091 накрывает большую часть линейки F0 и апеллировать к "какому-то чипу" здесь немного странно. Это уж не говоря про то, что название "Interrupt flag clear register" как-то не очень предполагает интересного содержимого.
Пишите сами и с головой будет полный порядок.
Чувствую, сегодняшний день будет обилен на сверх-ценные советы.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: STM32 новичку в ARM что к чему

Сообщение VladislavS »

Да ёлки-палки, все ошибаются, поржали и пошли дальше. Можно подумать, других более серьёзных ошибок в RM не бывает.
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32 новичку в ARM что к чему

Сообщение a5021 »

Хорошо, обязуюсь впредь сообщать здесь лишь о тех ошибках в МК, которые угрожают неминуемой смертью всему человечеству.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: STM32 новичку в ARM что к чему

Сообщение VladislavS »

Ну почему же, информация нужная и полезная. Кто-то даже про оператор |= узнал из дампа. Просто к чему такие эмоции?
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32 новичку в ARM что к чему

Сообщение a5021 »

Настроение, наверное, такое. Кстати, тут попутно заинтересовался, а если ли возможность в языке Си определить write-only конструкцию? Армы наворотили вот таких макросов, только непонятно, с какой целью:

Код: Выделить всё

#ifdef __cplusplus
  #define   __I     volatile             /*!< Defines 'read only' permissions */
#else
  #define   __I     volatile const       /*!< Defines 'read only' permissions */
#endif
#define     __O     volatile             /*!< Defines 'write only' permissions */
#define     __IO    volatile             /*!< Defines 'read / write' permissions */
Чего было тужиться, если 'write only' ничем не отличается от 'read / write' ?
Аватара пользователя
Ярослав555
Поставщик валерьянки для Кота
Сообщения: 2081
Зарегистрирован: Пт май 31, 2013 17:14:38
Откуда: Украина, Винница

Re: STM32 новичку в ARM что к чему

Сообщение Ярослав555 »

volatile указывает компилятору что эту переменную нельзя оптимизировать (вырезать), и только. и армы тут ни при чем.
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32 новичку в ARM что к чему

Сообщение a5021 »

Код писали армы (Copyright (c) 2009-2018 Arm Limited. All rights reserved), т.ч. это компилятор тут скорее ни при чем, а армы очень даже причем. Тужились изобразить то, чего не существует в природе.
Аватара пользователя
Ярослав555
Поставщик валерьянки для Кота
Сообщения: 2081
Зарегистрирован: Пт май 31, 2013 17:14:38
Откуда: Украина, Винница

Re: STM32 новичку в ARM что к чему

Сообщение Ярослав555 »

нет. армы перестраховались от того, что компилятор порежет какую-то инициализацию/работу с областью памяти и использовали стандартный подход.
Спойлер"А зачем вообще тогда нужно ключевое слово volatile? Джеймс Канзе пишет, что задумывался volatile для работы с memory mapped IO (MMIO). Интересно он пишет, переведу кусок подробно

На уровне железа многие процессоры просто резервируют блок адресов памяти для портов ввода-вывода. Большинство процессоров имеют отдельное пространство адресов ввода-вывода, со специальными инструкциями для доступа туда, но это не универсально (на PDP-11 такого не было, например) и даже сейчас, производители железа могут предпочесть использовать для этого адресное пространство памяти, по разным причинам. Я сомневаюсь, что кто-то так делает на архитектуре 8086 - различные адресные ограничения делают это очень сложным. Я видел это на 8080, это очень частое решение на старой TI 9900. И это был единственный способ организовать ввод-вывод на наборе инструкций PDP-11, там просто не было отдельного адресного пространства ввода-вывода (Я думаю, то же самое верно и для VAX. И не забывайте, что большинство работы на С раньше проходило именно на этих двух процессорах).
Теперь рассмотрим один из первых последовательных портов, что я использовал: Intel 8051. Нормальным способом его инициализации было записать 0 три раза в порт управления. Если у вас MMIO, то код на С мог бы выглядеть примерно так:

unsigned char* pControl = 0xff24 ;
*pControl = 0 ;
*pControl = 0 ;
*pControl = 0 ;

Что прекрасно работало на всех компиляторах С. Но вы можете себе представить, что могла бы с этим сделать сама простая оптимизация. По этой причине и нужно было ключевое слово volatile, чтобы сказать компилятору не оптимизировать."
http://alenacpp.blogspot.com/2006/04/volatile.html
но погуглить это не наши методы.
Ответить

Вернуться в «ARM»