STM32 новичку в ARM что к чему
- prinv
- Вымогатель припоя
- Сообщения: 677
- Зарегистрирован: Чт янв 20, 2011 09:07:08
- Откуда: Пермь
- Контактная информация:
Re: STM32 новичку в ARM что к чему
Заново сгенерируйте проект Кубом - у вас заголовок отклеился 
Никакая контра не уйдёт от нас
- Реклама
Re: STM32 новичку в ARM что к чему
из-за одного заголовочника перегенерировать проект, серьезно?)
- prinv
- Вымогатель припоя
- Сообщения: 677
- Зарегистрирован: Чт янв 20, 2011 09:07:08
- Откуда: Пермь
- Контактная информация:
Re: STM32 новичку в ARM что к чему
что за проблемы нажать кнопку в Кубе?
Никакая контра не уйдёт от нас
Re: STM32 новичку в ARM что к чему
Вот объясните мне, либо я туплю, либо стм-ы, либо кто-то еще. 
Дано: RM0091, стр. 741, описание регистра USARTx_ICR. Из описания явствует, что регистр работает только на запись. Запись единицы в конкретное битовое поле приводит к тому, что сбрасывается соответствующий бит в регистре статуса USARTx_ISR. Пишем в один регистр, биты сбрасываются в другом. Запись нуля ничего не меняет и ни к каким результатам не приводит. До этого момента все просто, понятно и логично. Непонятки начинаются с приложения А.19 (стр. 984), где приводятся примеры реализации некоторых режимов работы USART. Так вот в этих чудных примерах при манипуляциях с регистром USARTx_ICR везде используются конструкции вида:
В этой строчке сначала происходит считывание регистра, потом операция логического "ИЛИ" с его значением, а затем запись результата обратно в регистр. Внимание, как говорится, вопрос: нахрена читать USART1->ICR, если известно, что он работает только на запись? Причем, эти обезьяны делают так везде: и в мануле и в кодснайпетах и пр. примерах. Это, типа, такой животный рефлекс у них выработался, что раз битовая запись, то обязательно через дизъюнкцию ? По другому никак? Зла не хватает.
Дано: RM0091, стр. 741, описание регистра USARTx_ICR. Из описания явствует, что регистр работает только на запись. Запись единицы в конкретное битовое поле приводит к тому, что сбрасывается соответствующий бит в регистре статуса USARTx_ISR. Пишем в один регистр, биты сбрасываются в другом. Запись нуля ничего не меняет и ни к каким результатам не приводит. До этого момента все просто, понятно и логично. Непонятки начинаются с приложения А.19 (стр. 984), где приводятся примеры реализации некоторых режимов работы USART. Так вот в этих чудных примерах при манипуляциях с регистром USARTx_ICR везде используются конструкции вида:
Код: Выделить всё
USART1->ICR |= USART_ICR_TCCF; /* Clear transfer complete flag */- prinv
- Вымогатель припоя
- Сообщения: 677
- Зарегистрирован: Чт янв 20, 2011 09:07:08
- Откуда: Пермь
- Контактная информация:
Re: STM32 новичку в ARM что к чему
[uquote="a5021",url="/forum/viewtopic.php?p=3432841#p3432841"]В этой строчке сначала происходит считывание регистра[/uquote]
Где вы видите чтение из регистра?
Какой в чтении смысл, если необходимо безусловно записать 1 в указанные биты?
Где вы видите чтение из регистра?
Какой в чтении смысл, если необходимо безусловно записать 1 в указанные биты?
Никакая контра не уйдёт от нас
- Реклама
- Ярослав555
- Поставщик валерьянки для Кота
- Сообщения: 2081
- Зарегистрирован: Пт май 31, 2013 17:14:38
- Откуда: Украина, Винница
Re: STM32 новичку в ARM что к чему
[uquote="arkhnchul",url="/forum/viewtopic.php?p=3431701#p3431701"]из-за одного заголовочника перегенерировать проект, серьезно?)[/uquote]
если код писать в местах специально отведенных, между коментариев, то перегенерация проекта кубом не затрагивает Ваш код. Если вдруг не знали.
если код писать в местах специально отведенных, между коментариев, то перегенерация проекта кубом не затрагивает Ваш код. Если вдруг не знали.
Re: STM32 новичку в ARM что к чему
[uquote="prinv",url="/forum/viewtopic.php?p=3432846#p3432846"]Где вы видите чтение из регистра?
[/uquote]
Хорошая шутка. Вам ассемблерный дамп показать или на слово поверите?
Хорошая шутка. Вам ассемблерный дамп показать или на слово поверите?
Если что, именно об этом я и спрашивал.Какой в чтении смысл, если необходимо безусловно записать 1 в указанные биты?
- prinv
- Вымогатель припоя
- Сообщения: 677
- Зарегистрирован: Чт янв 20, 2011 09:07:08
- Откуда: Пермь
- Контактная информация:
Re: STM32 новичку в ARM что к чему
[uquote="a5021",url="/forum/viewtopic.php?p=3432855#p3432855"][uquote="prinv",url="/forum/viewtopic.php?p=3432846#p3432846"]Где вы видите чтение из регистра?
[/uquote]
Хорошая шутка. Вам ассемблерный дамп показать или на слово поверите?[/uquote]
Я бы с дампа и начал.
Хорошая шутка. Вам ассемблерный дамп показать или на слово поверите?[/uquote]
Я бы с дампа и начал.
Никакая контра не уйдёт от нас
Re: STM32 новичку в ARM что к чему
Приветствую такой подход:
Внимательно смотрим на строку дампа с номером 840.
Код: Выделить всё
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
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: STM32 новичку в ARM что к чему
[uquote="a5021",url="/forum/viewtopic.php?p=3432841#p3432841"]Это, типа, такой животный рефлекс у них выработался, что раз битовая запись, то обязательно через дизъюнкцию ? По другому никак? Зла не хватает.[/uquote]Допускаю, что в каком-то чипе, ну может же быть такое, эти биты RW. Переписывать либы под каждый чип? Не индусский подход.
Хотя, скорее всего, именно животный рефлекс. Пишите сами и с головой будет полный порядок.
[uquote="prinv",url="/forum/viewtopic.php?p=3432863#p3432863"]Я бы с дампа и начал.[/uquote]А я бы с учебника по С.
[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 что к чему
[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 что к чему
[uquote="prinv",url="/forum/viewtopic.php?p=3432879#p3432879"]Век живи - век учись![/uquote]
Представляете, как будет удивлён индус, писавший это
Представляете, как будет удивлён индус, писавший это
Re: STM32 новичку в ARM что к чему
[uquote="VladislavS",url="/forum/viewtopic.php?p=3432874#p3432874"]Допускаю, что в каком-то чипе, ну может же быть такое, эти биты RW. Переписывать либы под каждый чип? Не индусский подход.
[/uquote]
Какие либы, если разговор идет про RM ? Допущения, конечно, хорошо, но RM0091 накрывает большую часть линейки F0 и апеллировать к "какому-то чипу" здесь немного странно. Это уж не говоря про то, что название "Interrupt flag clear register" как-то не очень предполагает интересного содержимого.
Какие либы, если разговор идет про RM ? Допущения, конечно, хорошо, но RM0091 накрывает большую часть линейки F0 и апеллировать к "какому-то чипу" здесь немного странно. Это уж не говоря про то, что название "Interrupt flag clear register" как-то не очень предполагает интересного содержимого.
Чувствую, сегодняшний день будет обилен на сверх-ценные советы.Пишите сами и с головой будет полный порядок.
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: STM32 новичку в ARM что к чему
Да ёлки-палки, все ошибаются, поржали и пошли дальше. Можно подумать, других более серьёзных ошибок в RM не бывает.
Re: STM32 новичку в ARM что к чему
Хорошо, обязуюсь впредь сообщать здесь лишь о тех ошибках в МК, которые угрожают неминуемой смертью всему человечеству.
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: STM32 новичку в ARM что к чему
Ну почему же, информация нужная и полезная. Кто-то даже про оператор |= узнал из дампа. Просто к чему такие эмоции?
Re: STM32 новичку в ARM что к чему
Настроение, наверное, такое. Кстати, тут попутно заинтересовался, а если ли возможность в языке Си определить write-only конструкцию? Армы наворотили вот таких макросов, только непонятно, с какой целью:
Чего было тужиться, если 'write only' ничем не отличается от 'read / write' ?
Код: Выделить всё
#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 */- Ярослав555
- Поставщик валерьянки для Кота
- Сообщения: 2081
- Зарегистрирован: Пт май 31, 2013 17:14:38
- Откуда: Украина, Винница
Re: STM32 новичку в ARM что к чему
volatile указывает компилятору что эту переменную нельзя оптимизировать (вырезать), и только. и армы тут ни при чем.
Re: STM32 новичку в ARM что к чему
Код писали армы (Copyright (c) 2009-2018 Arm Limited. All rights reserved), т.ч. это компилятор тут скорее ни при чем, а армы очень даже причем. Тужились изобразить то, чего не существует в природе.
- Ярослав555
- Поставщик валерьянки для Кота
- Сообщения: 2081
- Зарегистрирован: Пт май 31, 2013 17:14:38
- Откуда: Украина, Винница
Re: STM32 новичку в ARM что к чему
нет. армы перестраховались от того, что компилятор порежет какую-то инициализацию/работу с областью памяти и использовали стандартный подход.
На уровне железа многие процессоры просто резервируют блок адресов памяти для портов ввода-вывода. Большинство процессоров имеют отдельное пространство адресов ввода-вывода, со специальными инструкциями для доступа туда, но это не универсально (на 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
но погуглить это не наши методы.
Спойлер
"А зачем вообще тогда нужно ключевое слово 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
но погуглить это не наши методы.


