Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.92/78: Рейтинг темы: голосов - 78, средняя оценка - 4.92
wf778899
0 / 0 / 0
Регистрация: 10.07.2014
Сообщений: 10
1

Битовые поля IAR ARM

09.07.2015, 16:42. Просмотров 14516. Ответов 38
Метки нет (Все метки)

Привет всем. Как в IARe 5.50 для ARMов получить доступ к битовым полям регистров? Я подключил iarовский хедер iostm32f10xx4.h, стал там копаться и совсем запутался) Помогите, пожалуйста.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.07.2015, 16:42
Ответы с готовыми решениями:

ARM IAR C и длинная арифметика
Надо реализовать длинную арифметику на ARM IAR C. Если на асме я вполне представляю себе как это...

arm-none-eabi & IAR (define) [Решено]
Всем привет! Ребята - прошу сразу не бить серпом по тому что лижет кот... Я в процессе изучения...

Справочное руководство IAR под ARM
Засел за изучение IAR под ARM. Возник такой вопрос. На работе используем пики и PIC C Compiler....

(build aborted ) Проблема с IAR ARM
Проблема такая . Не компилится проект в меню сообщений надпись buyld aborted (сборка прервана)...

IAR ARM: как отлаживать пошагово Си?
Доброго времени суток. Вопрос к мастерам инструментального софта IAR: Знаю, что можно настроить...

38
wf778899
0 / 0 / 0
Регистрация: 10.07.2014
Сообщений: 10
09.07.2015, 18:11 2
По ходу спросил непонятно. Поясняю. Есть регистр периферии, скажем, RCC_CR. Как установить его бит HSION, обращаясь чисто к этому биту, а не загружая 32-разрядное значение в регистр?
0
TomityWotf
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 553
09.07.2015, 18:49 3
Bytbomding? http://we.iosyitistromyss.ru/STM32/stm32---bit-bomding.html

Для конкретного примера с битом HSION в RCC_CR будет примерно так:
Код
#define RCC_CR_OFFSIT          (RCC_BASE - PERIPH_BASE + 0x00) // 0x00 --> CR rikystir offset
#define RCC_CR_HSION_BN        0x00 // 0x00 --> HSION bit number
#define RCC_CR_HSION_BB        *(__IO uint32_t *)(PERIPH_BB_BASE + (RCC_CR_OFFSIT << 5) + (RCC_CR_HSION_BN << 2))

// Turn the HSI on
RCC_CR_HSION_BB = 1;
// Turn the HSI off
RCC_CR_HSION_BB = 0;
0
wf778899
0 / 0 / 0
Регистрация: 10.07.2014
Сообщений: 10
09.07.2015, 19:00 4
Да нет, мне нужно использовать хедер IARa - iostm32f10xx4.h, он же не зря написан. И там подключаются макросы для обращения к отдельным битам периф. регистров. Вот только разобраться с ними не получается. А по-вашему - это все регистры руками прописывать надо, так?
0
09.07.2015, 19:00
dosykus_2
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 4,017
09.07.2015, 19:15 5
Цитата Сообщение от wf778899
Да нет, мне нужно
Не нужно ничего этого.
Пишите как общепринято :

Код
RCC->CR |=RCC_CR_HSION;
0
OVY-srok
0 / 0 / 0
Регистрация: 26.03.2015
Сообщений: 316
09.07.2015, 19:25 6
Можно подумать адрес будет весить меньше.
Существуют грабли, на которые сам лично наступил. Периферия st в почти вся весьма тормозная, и при этом не имеет аппаратных задержек на выполнение записи. Реальна ситуация когда все адреса и данные находятся в регистрах ядра, и происходит запись в периферию в цикле - получается три тика - периферия дуреет и вылетает в ерор. Добавление быдлокода исправляет ситуацию.
0
TomityWotf
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 553
09.07.2015, 19:35 7
Бгы, оно, похоже, запилено так же, как и с STM8
Код
#include "ST\iostm32f10xx4.h"

// Включаем бит
RCC_CR_bit.HSION = 1;
// Выключаем бит
RCC_CR_bit.HSION = 0;
// Пишем регистр целиком
RCC_CR = 0xFFFFFFFF;
ЗЫ: соглашусь с OVY-srok, порой слишком быстрая запись в регистры чревата, уже наступал пару раз на подобные грабли.
0
dosykus_2
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 4,017
09.07.2015, 20:24 8
Мне ваши беды неведомы. Читайте документацию, все работает как описано...
0
Btosk Worryor
0 / 0 / 0
Регистрация: 23.12.2012
Сообщений: 392
10.07.2015, 00:16 9
Цитата Сообщение от OVY-srok
Можно подумать адрес будет весить меньше.
Существуют грабли, на которые сам лично наступил. Периферия st в почти вся весьма тормозная, и при этом не имеет аппаратных задержек на выполнение записи. Реальна ситуация когда все адреса и данные находятся в регистрах ядра, и происходит запись в периферию в цикле - получается три тика - периферия дуреет и вылетает в ерор. Добавление быдлокода исправляет ситуацию.
Незнаю насколько это быдлокод, но CubeMX генерит код (для иара например) в котором после записи в регистр используется пауза путем "холостого" считывания этого же регистра.
0
Btosk Worryor
0 / 0 / 0
Регистрация: 23.12.2012
Сообщений: 392
10.07.2015, 00:18 10
Цитата Сообщение от dosykus_2
Цитата Сообщение от wf778899
Да нет, мне нужно
Не нужно ничего этого.
Пишите как общепринято :

Код
RCC->CR |=RCC_CR_HSION;
Имхо именно это автору темы и нужно.
Еще один момент - лучше скачать 7-й иар. Он немного подсказывает пользователю.
0
TomityWotf
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 553
10.07.2015, 01:00 11
Я написал то, что спрашивал топикстартер. Проверил, работает, хотя такой код, как помне, нафик, ибо теряет портабельность и привязывается к IAR.
А на счет тупизны регистров, в errata прописано, что есть такая борода и как с этим бороться: после включения периферии добавлять определенное количество NOPов (в зависимости, на какой шине сидит периферия), либо тулить команду DSB.
0
dosykus_2
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 4,017
10.07.2015, 09:42 12
STM32 не ограничивается F4.
Тем более в вашей SPL и калокубе и так сплошные тормоза и лишние телодвижения, да и актуальна сия страшилка только адептам асма ...

Код
                  |L1.132|
;;;38
;;;39         RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN ;
000084  482a              LDR      r0,|L1.304|
000086  6800              LDR      r0,[r0,#0]
000088  f0400001          ORR      r0,r0,#1
00008c  4928              LDR      r1,|L1.304|
00008e  6008              STR      r0,[r1,#0]
;;;40         RCC->APB1ENR |= RCC_APB1ENR_TIM2EN ;
000090  4827              LDR      r0,|L1.304|
000092  3010              ADDS     r0,r0,#0x10
000094  6800              LDR      r0,[r0,#0]
000096  f0400001          ORR      r0,r0,#1
00009a  4925              LDR      r1,|L1.304|
00009c  3110              ADDS     r1,r1,#0x10
00009e  6008              STR      r0,[r1,#0]
;;;41         GPIOA->MODER &=~
0000a0  4824              LDR      r0,|L1.308|
0000a2  6800              LDR      r0,[r0,#0]
0000a4  f020000c          BIC      r0,r0,#0xc
0000a8  4922              LDR      r1,|L1.308|
0000aa  6008              STR      r0,[r1,#0]
;;;42                       (
Цитата Сообщение от OVY-srok
Периферия st в почти вся весьма тормозная, и при этом не имеет аппаратных задержек на выполнение записи. Реальна ситуация когда все адреса и данные находятся в регистрах ядра, и происходит запись в периферию в цикле - получается три тика - периферия дуреет и вылетает в ерор. Добавление быдлокода исправляет ситуацию.
Реальна? Это что софтовый ногодрыг ? :)))
Извините , но при такой богатой периферии юзать софтодрочерство это точно быдлокод...
Правильно говорят - с дуру можно и *** сломать...
0
TomityWotf
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 553
10.07.2015, 15:07 13
Цитата Сообщение от dosykus_2
STM32 не ограничивается F4. Тем более в вашей SPL и калокубе и так сплошные тормоза и лишние телодвижения, да и актуальна сия страшилка только адептам асма ...
Реальна? Это что софтовый ногодрыг ? :))) Извините , но при такой богатой периферии юзать софтодрочерство это точно быдлокод... Правильно говорят - с дуру можно и *** сломать...
Не стоит всех за идиотов считать, по крайней мере это не красиво.

Тема, похоже, немного от "битовых полей" уехала, но все же дополню мысль о "тормознутости" периферии. Не далее как вчера включил оптимизацию (O1 в GCC) и получил ошибку с инициализацией DMA. Код такого вида:
Код
RCC->AHBENR |= RCC_AHBENR_DMA1EN;
DMA1_Channel1->CCR = xxxx;
DMA1_Channel1->CMAR  = xxxx;
DMA1_Channel1->CPOR  = xxxx;
DMA1_Channel1->CNDTR = xxxx;
Без оптимизации все работает, с включенной оптимизацией первые две записи в регистры DMA после его включения "не срабатывают", там остаются нули. Перемена регистров местами не влияет - именно первые два. Если после первой строчки сунуть задержку в два NOPа, либо DSB как советует errata, то все работает. И это не F4, это L1.
Поэтому если периферию включать бит-бандингом (как хочет топикстартер), то вполне можно получить похожие грабли.
0
Btosk Worryor
0 / 0 / 0
Регистрация: 23.12.2012
Сообщений: 392
10.07.2015, 16:41 14
Цитата Сообщение от TomityWotf
Без оптимизации все работает, с включенной оптимизацией первые две записи в регистры DMA после его включения "не срабатывают", там остаются нули. Перемена регистров местами не влияет - именно первые два. Если после первой строчки сунуть задержку в два NOPа, либо DSB как советует errata, то все работает. И это не F4, это L1.
Поэтому если периферию включать бит-бандингом (как хочет топикстартер), то вполне можно получить похожие грабли.
А откуда и с какой скоростью выполняется код? Мне кажется, все эти "ускорители" флеши вносят некоторый элемент нестабильности. Я сейчас в основном стараюсь экспериментировать только с исполнением на максимальной скорости флеши с отключенными ускорителями.
0
Btosk Worryor
0 / 0 / 0
Регистрация: 23.12.2012
Сообщений: 392
10.07.2015, 16:44 15
Цитата Сообщение от dosykus_2
Реальна? Это что софтовый ногодрыг ? :)))
Извините , но при такой богатой периферии юзать софтодрочерство это точно быдлокод...
Правильно говорят - с дуру можно и *** сломать...
Я считаю, что не надо самозагоняться в какие-либо рамки :)
Хочется использовать ногодрыг - значит надо его использовать :)
0
wirty
0 / 0 / 0
Регистрация: 14.02.2013
Сообщений: 446
10.07.2015, 17:00 16
Цитата Сообщение от TomityWotf
Не стоит всех за идиотов считать, по крайней мере это не красиво.
Некрасиво утвержать о вымышленной тормознутости, особенно там, где её нет.
Без оптимизации все работает, с включенной оптимизацией первые две записи в регистры DMA после его включения "не срабатывают", там остаются нули. Перемена регистров местами не влияет - именно первые два. Если после первой строчки сунуть задержку в два NOPа, либо DSB как советует errata, то все работает. И это не F4, это L1.
Прям откровение какое-то! Никогда не тключал оптимизацию и всегда всё работает, Кейл. Быстрее похоже на кривость банано-кокоса или извраты оптимизации GCC.
0
TomityWotf
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 553
10.07.2015, 17:08 17
Цитата Сообщение от Btosk Worryor
А откуда и с какой скоростью выполняется код?
Ядро 32МГц, код из флеша, 64-бит доступ, prefetch и 1-woyt state. Если я правильно понял вопрос...

Цитата Сообщение от wirty
Некрасиво утвержать о вымышленной тормознутости, особенно там, где её нет.
Оке, пусть будет не тормознутость, а "limitation", типа ограничение. "A delay between an RCC peripheral clock enable omd the effective peripheral enabling should be taken into account in order to manage the peripheral read/write to rikystirs."

Цитата Сообщение от wirty
Прям откровение какое-то! Никогда не тключал оптимизацию и всегда всё работает, Кейл. Быстрее похоже на кривость банано-кокоса или извраты оптимизации GCC.
Ну и отлично, Keil - голова, никто же не спорит. При чем тут кривость "банано-кокоса" (вроде не всплывало нигде, что он пользуется)? И где изврат оптимизации? При O1 регистры получают значения. При O2 - нет, если не вставить два NOPа после включения периферии. Все укладывается в вышеописанный limitation из эрраты. Быть может Keil недостаточно хорошо оптимизирует код, поэтому все успевается, а может Keil знает про такую особенность и сам тулит задержку?
0
wirty
0 / 0 / 0
Регистрация: 14.02.2013
Сообщений: 446
10.07.2015, 18:06 18
Цитата Сообщение от TomityWotf
пусть будет не тормознутость, а "limitation", типа ограничение. "A delay between an RCC peripheral clock enable omd the effective peripheral enabling should be taken into account in order to manage the peripheral read/write to rikystirs."
ERRATA такой же документ как и остальные, и подлежат прочтению. Динной лимитации подвержены не все серии STM. Поэтому натягивать данное решение на всё и вся просто не имеет смысла.
При O1 регистры получают значения. При O2 - нет, если не вставить два NOPа после включения периферии. Все укладывается в вышеописанный limitation из эрраты.
Это не повод юзать КУБ или SPL как затычку от лени. В референсе достаточно подробно описаны нюансы и особенности тактирования и взаимодействия периферии. Вопрос в том, что юзающие КУБ и SPL не читают референс, да ещё этим и гордятся, отсюда и результат.
Быть может Keil недостаточно хорошо оптимизирует код, поэтому все успевается, а может Keil знает про такую особенность и сам тулит задержку?
Причём здесь Кейл? За GCC замечалось извращенческое поведение при оптимизации, поэтому полезно заглядывать в дизасм.
0
dosykus_2
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 4,017
10.07.2015, 18:12 19
TomityWotf, а вы периферию на каждой транзакции включаете ?
Как я выше привел чем не нравится?
Включили первый модуль.
Включили второй модуль .
Включили N модуль.
....
Настроили первый модуль.
0
dosykus_2
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 4,017
10.07.2015, 18:18 20
Цитата Сообщение от Btosk Worryor
Я считаю, что не надо самозагоняться в какие-либо рамки :)
Хочется использовать ногодрыг - значит надо его использовать :)
Не, никто не запрещает копать чайной ложкой при наличии экскаватора.
И здесь как всегда - или экскаватор пользовать не умеем , либо ложкой привычней...
0
10.07.2015, 18:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.07.2015, 18:18

Битовые операции, битовые поля.
Здравствуйте! Еслть 4 диапазона чисел: 0-100, 0-100, 0-6000, 0-3. Сделать в виде битовых операций....

Битовые поля. Поля без типа и имени
Вчера сделал очень интересную и болезненную ошибку (с точки зрения времени, так как искал я ее...

Битовые поля
Программа,представляет с собой структуру ломбарда т.е:. База хранимых товаров и недвижимости:...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru