STM32 новичку в ARM что к чему
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: STM32 новичку в ARM что к чему
Т.е и так тоже можно?
*(__IO uint32_t*)0x40000000 = 0x5555AAAA;
Получается 0x40000000 это тот адрес, который лежит в указателе, а *(__IO uint32_t*)0x40000000 это обращение по этому адресу, который лежит в указателе?
*(__IO uint32_t*)0x40000000 = 0x5555AAAA;
Получается 0x40000000 это тот адрес, который лежит в указателе, а *(__IO uint32_t*)0x40000000 это обращение по этому адресу, который лежит в указателе?
Станислав
- Реклама
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: STM32 новичку в ARM что к чему
Да, всё верно, можно и так.
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: STM32 новичку в ARM что к чему
Хорошо. Тогда где сам указатель?
Добавлено after 2 minutes 25 seconds:
Просто, обычно, (как правило, во всех примерах по языку) указатель - это тоже переменная.
Добавлено after 2 minutes 25 seconds:
Просто, обычно, (как правило, во всех примерах по языку) указатель - это тоже переменная.
Станислав
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: STM32 новичку в ARM что к чему
Не совсем понял, какой указатель. В Вашей записи он присутствует неявно (к нему приводится число 0x40000000), но он тут же разыменовывается. Но вообще гляньте на предыдущей странице моё последнее сообщение в конце.
Указатель - не обязательно переменная. В нашем случае он константа, численно равная 0x40000000. А уже там, по этому адресу, лежит переменная.
Указатель - не обязательно переменная. В нашем случае он константа, численно равная 0x40000000. А уже там, по этому адресу, лежит переменная.
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: STM32 новичку в ARM что к чему
Да. вот эта конструкция абсолютно понятна.
Потому что здесь есть имя указателя, как обычной переменной. А в МК его нету.. Вот и путаница
Добавлено after 3 minutes 15 seconds:
[uquote="WiseLord",url="/forum/viewtopic.php?p=4050556#p4050556"]Указатель - не обязательно переменная. В нашем случае он константа, численно равная 0x40000000.[/uquote]
Вот! Именно это никто не говорит в курсах про Си. Там явно и однозначно говорят, что указатель это такая переменная, которая.. бла бла. А то, что он может быть константой я нигде не видел! И теперь у меня колапс головного мозга, как уложить то, что просто константа (по сути цифра) может тоже быть указателем.
Код: Выделить всё
volatile uint32_t *ptr;
ptr = 0x40000004;
*ptr = 0x5555AAAA;Добавлено after 3 minutes 15 seconds:
[uquote="WiseLord",url="/forum/viewtopic.php?p=4050556#p4050556"]Указатель - не обязательно переменная. В нашем случае он константа, численно равная 0x40000000.[/uquote]
Вот! Именно это никто не говорит в курсах про Си. Там явно и однозначно говорят, что указатель это такая переменная, которая.. бла бла. А то, что он может быть константой я нигде не видел! И теперь у меня колапс головного мозга, как уложить то, что просто константа (по сути цифра) может тоже быть указателем.
Станислав
- Реклама
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: STM32 новичку в ARM что к чему
Но это имя по сути не нужно.
Это абсолютно эквивалентно
Вся эта конструкция (volatile uint32_t*)0x40000004 - это и есть тот самый ptr. Отдельное имя ему выделять не обязательно. Удобнее выделить отдельное имя сразу для *ptr
Добавлено after 3 minutes 38 seconds:
А ведь разницы никакой нет. Когда мы пишем, например, const int buf[] = {5, 3, 4, 2}; - мы ведь точно так же имеем buf - константный указатель. Просто в этом случае компилятор где-то разместит этот массив в памяти (во flash-памяти, например) и присвоит buf-у константный указатель на это место. А в наших примерах мы можем делать это руками, так как адреса периферий фиксированные.
Код: Выделить всё
volatile uint32_t *ptr = 0x40000004;
*ptr = 0x5555AAAA;Код: Выделить всё
*(volatile uint32_t*)0x40000004 = 0x5555AAAA;Добавлено after 3 minutes 38 seconds:
Вы так говорите, как будто не использовали никогда константных строк или константных массивов.СКАЗОЧНИК писал(а):Именно это никто не говорит в курсах про Си. Там явно и однозначно говорят, что указатель это такая переменная, которая.. бла бла
А ведь разницы никакой нет. Когда мы пишем, например, const int buf[] = {5, 3, 4, 2}; - мы ведь точно так же имеем buf - константный указатель. Просто в этом случае компилятор где-то разместит этот массив в памяти (во flash-памяти, например) и присвоит buf-у константный указатель на это место. А в наших примерах мы можем делать это руками, так как адреса периферий фиксированные.
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: STM32 новичку в ARM что к чему
Видимо, я очень плохо соображаю в Си. что так и есть.
Даже констаный массив, который Вы описали имеет имя. И я его вижу именно по имени, а не цифрами в виде адреса. ))))))) А то, что потом с ним сделает компилятор уже его дело.
В наших же вышеуказанных примерах, имен все равно нету. Есть конечное объявление (через дефайн) на обращение по указателю. Короче, я понял, что мне не хватает. ) Одного урока по Си, где бы были примеры и варианты использования констант как указателей. Что не обязательно задвать указателю имя, как переменной и что он вообще может не являться перменной. А может быть реальной константой и при этом без имени, а тупо само число. И компилятор все это нормально схавает.
Конечно, с учетом среды, где все это используется. Если это программирование для РС, то может и выкинут, если залезть в неразрешенный адрес, а если это МК, то адреса можно посмотреть в рефренс мануале.
Даже констаный массив, который Вы описали имеет имя. И я его вижу именно по имени, а не цифрами в виде адреса. ))))))) А то, что потом с ним сделает компилятор уже его дело.
В наших же вышеуказанных примерах, имен все равно нету. Есть конечное объявление (через дефайн) на обращение по указателю. Короче, я понял, что мне не хватает. ) Одного урока по Си, где бы были примеры и варианты использования констант как указателей. Что не обязательно задвать указателю имя, как переменной и что он вообще может не являться перменной. А может быть реальной константой и при этом без имени, а тупо само число. И компилятор все это нормально схавает.
Конечно, с учетом среды, где все это используется. Если это программирование для РС, то может и выкинут, если залезть в неразрешенный адрес, а если это МК, то адреса можно посмотреть в рефренс мануале.
Станислав
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: STM32 новичку в ARM что к чему
СКАЗОЧНИК, научитесь смотреть листинг того что делает компилятор. Проще понимать что делает код будет. Вот что делает ваш код.Обратите внимание, как при доступе по адресу 0x40000004 был использован базовый адрес 0x40000000 и смещение 4 от него. Точно так же осуществляется доступ к полям структуры смещением от базового адреса.
Добавлено after 1 minute 43 seconds:
[uquote="СКАЗОЧНИК",url="/forum/viewtopic.php?p=4050565#p4050565"]А может быть реальной константой и при этом без имени, а тупо само число.[/uquote]Не тупо само число!!! Вы же делаете приведение типа от числа к указателю. Результат этого приведения и есть указатель. Тупо записать в число, конечно же, ничего нельзя.
Добавлено after 4 minutes 15 seconds:
А теперь найдите хоть одно отличие
Код: Выделить всё
//*(__IO uint32_t*)0x40000000 = 0x5555AAAA;
MOVS R0,#+128
LSLS R0,R0,#+23
LDR R1,??DataTable1
STR R1,[R0, #+0]
//*((__IO uint32_t*)0x40000000+1) = 0x5555AAAA;
STR R1,[R0, #+4]
//*(__IO uint32_t*)0x40000004 = 0x5555AAAA;
STR R1,[R0, #+4]
??DataTable1:
DATA32
DC32 0x5555aaaa Добавлено after 1 minute 43 seconds:
[uquote="СКАЗОЧНИК",url="/forum/viewtopic.php?p=4050565#p4050565"]А может быть реальной константой и при этом без имени, а тупо само число.[/uquote]Не тупо само число!!! Вы же делаете приведение типа от числа к указателю. Результат этого приведения и есть указатель. Тупо записать в число, конечно же, ничего нельзя.
Добавлено after 4 minutes 15 seconds:
А теперь найдите хоть одно отличие
Код: Выделить всё
//__IO uint32_t *adr = (uint32_t *)0x40000000;
// *adr = 0x5555AAAA;
MOVS R0,#+128
LSLS R0,R0,#+23
LDR R1,??DataTable1
STR R1,[R0, #+0]
//*(adr+1) = 0x5555AAAA;
STR R1,[R0, #+4]
??DataTable1:
DATA32
DC32 0x5555aaaa
Последний раз редактировалось VladislavS Пн июн 21, 2021 12:22:15, всего редактировалось 1 раз.
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: STM32 новичку в ARM что к чему
Приведение типа к указателю на структуру. Если до меня правильно доходит..
А можно так написать?
(__IO uint32_t*)0x40000000;
*0x40000000 = 0x5555AAAA;
А можно так написать?
(__IO uint32_t*)0x40000000;
*0x40000000 = 0x5555AAAA;
Станислав
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: STM32 новичку в ARM что к чему
[uquote="СКАЗОЧНИК",url="/forum/viewtopic.php?p=4050572#p4050572"]А можно так написать?[/uquote]Да написать то что угодно можно, бумага всё стерпит. Только фигняс получается.
Последний раз редактировалось VladislavS Пн июн 21, 2021 12:24:43, всего редактировалось 1 раз.
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: STM32 новичку в ARM что к чему
Так нельзя, это синтаксическая ошибка. Разыменовывать просто число нельзя.
А вот разыменовать это же число, приведённое к конкретному указателю - можно. Хотя формально и то и другое - одно и то же число, но в одном случае - это просто число, а во втором - адрес некоторой ячейки.
Кстати, в примере ниже результат будет тоже разный, несмотря на "одно и то же число"
А вот разыменовать это же число, приведённое к конкретному указателю - можно. Хотя формально и то и другое - одно и то же число, но в одном случае - это просто число, а во втором - адрес некоторой ячейки.
Кстати, в примере ниже результат будет тоже разный, несмотря на "одно и то же число"
Код: Выделить всё
*(__IO uint32_t*)0x40000000 = 0x5555AAAA;
*(__IO uint16_t*)0x40000000 = 0x5555AAAA;
*(__IO uint8_t*)0x40000000 = 0x5555AAAA;
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: STM32 новичку в ARM что к чему
Благодарю за помощь. ) Много нового узнал.
Добавлено after 4 minutes 4 seconds:
[uquote="WiseLord",url="/forum/viewtopic.php?p=4050577#p4050577"]Кстати, в примере ниже результат будет тоже разный, несмотря на "одно и то же число"[/uquote]
Правильно я понмаю, что превое - это указатель на область памяти в 32 бита с адресом 0x40000000, и в эту область можно нормально записать число 0x5555AAAA, а в два других уже не влезет.? Хоть эта область расположена по этому же адресу...
Добавлено after 4 minutes 4 seconds:
[uquote="WiseLord",url="/forum/viewtopic.php?p=4050577#p4050577"]Кстати, в примере ниже результат будет тоже разный, несмотря на "одно и то же число"
Код: Выделить всё
*(__IO uint32_t*)0x40000000 = 0x5555AAAA;
*(__IO uint16_t*)0x40000000 = 0x5555AAAA;
*(__IO uint8_t*)0x40000000 = 0x5555AAAA;
Правильно я понмаю, что превое - это указатель на область памяти в 32 бита с адресом 0x40000000, и в эту область можно нормально записать число 0x5555AAAA, а в два других уже не влезет.? Хоть эта область расположена по этому же адресу...
Станислав
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: STM32 новичку в ARM что к чему
Что значит "не влезет"?
Константа 0x5555AAAA будет приведена к типу левого операнда и будет записана командами STR, STRH и STRB соответственно.
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: STM32 новичку в ARM что к чему
Ассемблер для STM пока что сложноватая штука для меня. ) Команды не такие , как были в АВР.
Станислав
-
mont-oriol
- Мучитель микросхем
- Сообщения: 437
- Зарегистрирован: Пн май 27, 2019 07:18:28
- Откуда: ВВХ-ск
Re: STM32 новичку в ARM что к чему
[uquote="VladislavS",url="/forum/viewtopic.php?p=4050583#p4050583"]Что значит "не влезет"?[/uquote]
Это значит, что в результате смены типа изменится значение.
А что ещё это может значить?
Это значит, что в результате смены типа изменится значение.
А что ещё это может значить?
- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: STM32 новичку в ARM что к чему
[uquote="СКАЗОЧНИК",url="/forum/viewtopic.php?p=4050589#p4050589"]Ассемблер для STM пока что сложноватая штука для меня. ) Команды не такие , как были в АВР.[/uquote]
Так экспериментируйте на AVR, кто мешает. Вот например как можно организовать порты для ATmega8
Так экспериментируйте на AVR, кто мешает. Вот например как можно организовать порты для ATmega8
Код: Выделить всё
#include <avr/io.h>
typedef struct{
uint8_t PIN;
uint8_t DDR;
uint8_t PORT;
}GPIO;
#define GPIOB ((volatile GPIO*)(0x0036))
#define GPIOC ((volatile GPIO*)(0x0033))
#define GPIOD ((volatile GPIO*)(0x0030))
int main(){
GPIOB->DDR = 1;
GPIOB->PORT = 2;
GPIOB->PIN = 3;
}- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: STM32 новичку в ARM что к чему
Почему адреса 36/33/30, а не 16/13/10?
Код: Выделить всё
// iom8.h
/* Port D */
#define PIND _SFR_IO8(0x10)
#define DDRD _SFR_IO8(0x11)
#define PORTD _SFR_IO8(0x12)
/* Port C */
#define PINC _SFR_IO8(0x13)
#define DDRC _SFR_IO8(0x14)
#define PORTC _SFR_IO8(0x15)
/* Port B */
#define PINB _SFR_IO8(0x16)
#define DDRB _SFR_IO8(0x17)
#define PORTB _SFR_IO8(0x18)- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: STM32 новичку в ARM что к чему
Ну, тут уже дело техники. ) Сам смысл понятен, что можно от традиционного АВР получить что-то похожее на СТМ. ) И если изначально так бы было, то переход с тех же АВР был бы легче.
Станислав
- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: STM32 новичку в ARM что к чему
[uquote="WiseLord",url="/forum/viewtopic.php?p=4050681#p4050681"]Почему адреса 36/33/30, а не 16/13/10?[/uquote]
Потому что указывается адрес, отображенный на память, а не сырой адрес для in/out.
Потому что указывается адрес, отображенный на память, а не сырой адрес для in/out.
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: STM32 новичку в ARM что к чему
Ага, ОК, увидел __SFR_OFFSET в sfr_defs.h, который может быть либо 0x20, либо 0x00 в разных МК AVR.


