Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

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

Пт авг 03, 2018 16:37:17

Заново сгенерируйте проект Кубом - у вас заголовок отклеился :-)

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

Пт авг 03, 2018 23:24:46

из-за одного заголовочника перегенерировать проект, серьезно?)

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

Сб авг 04, 2018 04:09:33

что за проблемы нажать кнопку в Кубе?

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

Пн авг 06, 2018 10:16:32

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

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

Код:
USART1->ICR |= USART_ICR_TCCF; /* Clear transfer complete flag */

В этой строчке сначала происходит считывание регистра, потом операция логического "ИЛИ" с его значением, а затем запись результата обратно в регистр. Внимание, как говорится, вопрос: нахрена читать USART1->ICR, если известно, что он работает только на запись? Причем, эти обезьяны делают так везде: и в мануле и в кодснайпетах и пр. примерах. Это, типа, такой животный рефлекс у них выработался, что раз битовая запись, то обязательно через дизъюнкцию ? По другому никак? Зла не хватает.

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

Пн авг 06, 2018 10:27:28

В этой строчке сначала происходит считывание регистра

Где вы видите чтение из регистра? :))
Какой в чтении смысл, если необходимо безусловно записать 1 в указанные биты?

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

Пн авг 06, 2018 10:30:10

из-за одного заголовочника перегенерировать проект, серьезно?)

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

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

Пн авг 06, 2018 10:38:34

Где вы видите чтение из регистра? :))

Хорошая шутка. Вам ассемблерный дамп показать или на слово поверите?

Какой в чтении смысл, если необходимо безусловно записать 1 в указанные биты?

Если что, именно об этом я и спрашивал.

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

Пн авг 06, 2018 10:55:10

Где вы видите чтение из регистра? :))

Хорошая шутка. Вам ассемблерный дамп показать или на слово поверите?

Я бы с дампа и начал.

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

Пн авг 06, 2018 10:59:58

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

Код:
 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.

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

Пн авг 06, 2018 11:16:15

Это, типа, такой животный рефлекс у них выработался, что раз битовая запись, то обязательно через дизъюнкцию ? По другому никак? Зла не хватает.
Допускаю, что в каком-то чипе, ну может же быть такое, эти биты RW. Переписывать либы под каждый чип? Не индусский подход. :) Хотя, скорее всего, именно животный рефлекс. Пишите сами и с головой будет полный порядок.

Я бы с дампа и начал.
А я бы с учебника по С.
Последний раз редактировалось VladislavS Пн авг 06, 2018 11:25:28, всего редактировалось 1 раз.

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

Пн авг 06, 2018 11:25:17

Внимательно смотрим на строку дампа с номером 840.

Век живи - век учись!
Правильнее будет писать просто
USART1->ICR = USART_ICR_TCCF;

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

Пн авг 06, 2018 11:28:32

Век живи - век учись!

Представляете, как будет удивлён индус, писавший это :)

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

Пн авг 06, 2018 11:44:20

Допускаю, что в каком-то чипе, ну может же быть такое, эти биты RW. Переписывать либы под каждый чип? Не индусский подход. :)

Какие либы, если разговор идет про RM ? Допущения, конечно, хорошо, но RM0091 накрывает большую часть линейки F0 и апеллировать к "какому-то чипу" здесь немного странно. Это уж не говоря про то, что название "Interrupt flag clear register" как-то не очень предполагает интересного содержимого.

Пишите сами и с головой будет полный порядок.

Чувствую, сегодняшний день будет обилен на сверх-ценные советы.

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

Пн авг 06, 2018 12:04:27

Да ёлки-палки, все ошибаются, поржали и пошли дальше. Можно подумать, других более серьёзных ошибок в RM не бывает.

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

Пн авг 06, 2018 12:19:19

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

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

Пн авг 06, 2018 13:00:24

Ну почему же, информация нужная и полезная. Кто-то даже про оператор |= узнал из дампа. Просто к чему такие эмоции?

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

Пн авг 06, 2018 13:08:23

Настроение, наверное, такое. Кстати, тут попутно заинтересовался, а если ли возможность в языке Си определить 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' ?

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

Пн авг 06, 2018 13:22:14

volatile указывает компилятору что эту переменную нельзя оптимизировать (вырезать), и только. и армы тут ни при чем.

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

Пн авг 06, 2018 13:59:24

Код писали армы (Copyright (c) 2009-2018 Arm Limited. All rights reserved), т.ч. это компилятор тут скорее ни при чем, а армы очень даже причем. Тужились изобразить то, чего не существует в природе.

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

Пн авг 06, 2018 14:45:04

нет. армы перестраховались от того, что компилятор порежет какую-то инициализацию/работу с областью памяти и использовали стандартный подход.
Спойлер"А зачем вообще тогда нужно ключевое слово 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
но погуглить это не наши методы.
Ответить