0 / 0 / 0
Регистрация: 06.04.2014
Сообщений: 215
|
|
1 | |
Видимо дурацкий вопрос но можно ли CRL и CRH объеденить?15.11.2014, 16:07. Показов 7276. Ответов 27
Метки нет (Все метки)
Читая инфу про удобную настройку портов, подумал а почему бы не попытаться объединить эти два регистра, чтобы упростить макрос настройки.
Попытался сделать через (uint64_t)(GPIOx->CRL = .....) настраивал 10 ножку, смотрел в отладчике асм, по началу все идет хорошо, в регистре появляется адрес CRH но потом что то идет не так и берется значение CRL. 1. Так не получится сделать в принципе. 2. сделать можно но будет медленно работать. 3. Не по феншую такие выкрутасы.
0
|
15.11.2014, 16:07 | |
Ответы с готовыми решениями:
27
Дурацкий вопрос Дурацкий вопрос по стилям Дурацкий вопрос по VBScript Дурацкий вопрос по DataGrid Replace дурацкий вопрос :) |
0 / 0 / 0
Регистрация: 03.10.2012
Сообщений: 701
|
|
15.11.2014, 17:07 | 2 |
Совсем непонятно, что там вам непонятно... и что хотите получить...
Камень какой??? Что делаете и что не получается???
0
|
0 / 0 / 0
Регистрация: 06.04.2014
Сообщений: 215
|
|
15.11.2014, 17:20 | 3 |
STM32F103, да особо ничего не делаю, потихоньку экспериментирую с портами и тп. Пришла мысль что можно попытаться обращаться к CRL и CRH как к одному 64 битному регистру.
0
|
0 / 0 / 0
Регистрация: 06.06.2011
Сообщений: 2,514
|
|
15.11.2014, 17:49 | 4 |
а шины данных внутри F103 уже 64х разрядные стали. чтобы за раз обращаться сразу к паре 32хбитных регистров?
0
|
3 / 3 / 0
Регистрация: 06.12.2016
Сообщений: 1,605
|
|
15.11.2014, 18:06 | 5 |
По-моему, вопрос не в разрядности шин, а в разрядности регистров. А они все 32-разрядные.
Как я понял из RM0008, CRL и CRH лежат рядом, по смежным адресам. Поэтому это вполне возможно нечто подобное: uint64_t *pCr = (uint64_t *)&(GPIOA->CRL); *pCr= 0xFFFFFFFF00000000; Ну а будет ли оно работать, не знаю :). Проверяйте :). От себя могу лишь сказать, что в GCC (Coosox) есть какие-то баги при работе с указателями uint64_t *. То ли при записи по такому указателю, то ли при чтении оттуда проц тупо вываливался в HordFault. Пришлось делать какой-то жуткий костыль, чтобы обойти этот баг. Но там я работал не с регистрами, а с ROM (обычные переменные). Хотя какая разница, адресное пространство ведь одно, для ядра всё равно, в ROM писать, или куда-то ещё ...
0
|
0 / 0 / 0
Регистрация: 06.04.2014
Сообщений: 215
|
|
15.11.2014, 18:37 | 6 |
Спасибо за подробный ответ, я на весьма любительском уровне всем этим занимаюсь, и языком плохо владею, запутался в скобках и приведении типов, кстати про баг, я пользуюсь кейлом, создал указатель uhint64_t и он даже указывает, но при попытке дать ему значение отличное от ноля, компилятор ругается что не может впихнуть int в uint64_t. Может это тоже баг какой.
0
|
3 / 3 / 0
Регистрация: 06.12.2016
Сообщений: 1,605
|
|
15.11.2014, 18:51 | 7 |
int - это 32 бит, а не 64. Плюс к этому int - знаковый тип, а любой uintxx_t - беззнаковый. Наверное поэтому и ругается.
Проверить работу указателей можно на примитивном примере: uint64_t temp = 0, *p; // p - указатель на temp *p = &temp; // Записываем в temp *p = (uint64_t)0xFFFFFFFF00000000; Впихните это в любую программу и проверьте отладкой, чему будет равна temp. Я думаю, Вы догадались, чему она должна быть равна :). Если оно отработает нормально, то переходите к регистрам. Если оно сглючит каким-либо образом, то, я думаю, Ваша хотелка вообще нереализуема. Тогда пользуйтесь как обычно, через CRH/CRL.
0
|
0 / 0 / 0
Регистрация: 06.04.2014
Сообщений: 215
|
|
15.11.2014, 19:06 | 8 |
Я наверно не совсем ясно выразился, указатель создается, но в программе я его не использую, но в ватч добавляю и вижу что значение указателя 0, а по этому адресу вижу 64битное значение, далее в программе я пишу ptr=1 ( пробовал подряд до 10), при компиляции выдает ошибку int не могу запихнуть в uint64_t, сейчас не у компа дословно процитировать не могу.
0
|
3 / 3 / 0
Регистрация: 06.12.2016
Сообщений: 1,605
|
|
15.11.2014, 19:26 | 9 |
Чтобы изменить то, на что указывает указатель, надо перед ним записать *.
ptr = 1; - это меняет сам указатель, а не то, на что он указывает. *ptr = 1; - а вот это меняет не указатель, а то, на что указатель указывает. Сам указатель не изменяется. Эти 2 оператора совершенно разные вещи. Ладно, когда доберётесь до компа, поговорим. А вообще - почитайте учебник по Си, раздел про указатели. Полезно будет :) . Язык Си практически не зависит от типа проца, на котором программа работает.
0
|
0 / 0 / 0
Регистрация: 16.05.2013
Сообщений: 157
|
|
15.11.2014, 19:29 | 10 |
0
|
0 / 0 / 0
Регистрация: 06.04.2014
Сообщений: 215
|
|
15.11.2014, 19:52 | 11 |
Я понимаю разницу, и я именно хочу изменить указатель.
0
|
0 / 0 / 0
Регистрация: 16.05.2013
Сообщений: 157
|
|
15.11.2014, 20:03 | 12 |
А как это коррелирует с твоим вопросом?
0
|
0 / 0 / 0
Регистрация: 06.04.2014
Сообщений: 215
|
|
15.11.2014, 20:06 | 13 |
Это был ответ для hd44780.
0
|
3 / 3 / 0
Регистрация: 06.12.2016
Сообщений: 1,605
|
|
15.11.2014, 20:28 | 14 |
Bmox77, когда доберётесь до компа, покажете код.
0
|
0 / 0 / 0
Регистрация: 06.04.2014
Сообщений: 215
|
|
15.11.2014, 21:10 | 15 |
Сделал так:
Сообщение от hd44780
0
|
0 / 0 / 0
Регистрация: 16.05.2013
Сообщений: 157
|
|
15.11.2014, 21:19 | 16 |
Bmox77, почитай, наконец ту ссылку и посмотри как работают с указателями в си.
0
|
0 / 0 / 0
Регистрация: 06.04.2014
Сообщений: 215
|
|
15.11.2014, 21:31 | 17 |
OrtDim, я прочитал по ссылке. Если вам не трудно ткните носом, что я делаю не так?
0
|
0 / 0 / 0
Регистрация: 16.05.2013
Сообщений: 157
|
|
15.11.2014, 21:43 | 18 |
У тебя p - это указатель, а *p - это то, на что указатель указывает. Так как тогда понять
*p = &temp; ?
0
|
3 / 3 / 0
Регистрация: 06.12.2016
Сообщений: 1,605
|
|
15.11.2014, 21:55 | 19 |
Извиняюсь. Это моя тупейшая опечатка.
// p - указатель на temp p = &temp;
0
|
0 / 0 / 0
Регистрация: 06.04.2014
Сообщений: 215
|
|
15.11.2014, 21:57 | 20 |
Блин и у меня глаза уже совсем замылились.
Ха, в общем через указатель вполне работает, только объясните мне что это значит (uint64_t *)&(GPIOB->CRL);?
0
|
15.11.2014, 21:57 | |
15.11.2014, 21:57 | |
Помогаю со студенческими работами здесь
20
Может дурацкий вопрос!!! Дурацкий вопрос про comboBox Вопрос по Crl, поддерживается ли расширенные поля. Инвертор CCFL дурацкий вопрос профана. Наверно, это самый дурацкий вопрос: http://www.public-trust.com/cgi-bin/CRL/2018/cdp.crl - адрес заблокирован Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |