Вопросы по С/С++ (СИ)
- ROMan2947
- Грызет канифоль
- Сообщения: 287
- Зарегистрирован: Сб янв 23, 2016 00:59:59
- Откуда: Чебоксары
Re: Вопросы по С/С++ (СИ)
Здравствуйте! захотелось в регистр GPIOA_MODER с адресом 0x4002 0000 записать число 1024. как это должно выглядеть на С.
- Реклама
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
GPIOA->MODER = 1024; если библиотеки CMSIS подключены
*((uint32_t *)0x40020000) = 1024; или как-то так, если нет
*((uint32_t *)0x40020000) = 1024; или как-то так, если нет
Re: Вопросы по С/С++ (СИ)
[uquote="WiseLord",url="/forum/viewtopic.php?p=4157063#p4157063"]GPIOA->MODER = 1024; если библиотеки CMSIS подключены
*((uint32_t *)0x40020000) = 1024; или как-то так, если нет[/uquote]
volatile забыли)
*((volatile uint32_t *)0x40020000) = 1024;
*((uint32_t *)0x40020000) = 1024; или как-то так, если нет[/uquote]
volatile забыли)
*((volatile uint32_t *)0x40020000) = 1024;
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Несущественно, сработает и без volatile.
- ROMan2947
- Грызет канифоль
- Сообщения: 287
- Зарегистрирован: Сб янв 23, 2016 00:59:59
- Откуда: Чебоксары
Re: Вопросы по С/С++ (СИ)
[uquote="WiseLord",url="/forum/viewtopic.php?p=4157063#p4157063"]
*((uint32_t *)0x40020000) = 1024; или как-то так, если нет[/uquote]
то что нужно!
этот же вариант использует CMSIS, т. е . самый низкий уровень не считая асм.
я так пытался сделать:
не работает.
*((uint32_t *)0x40020000) = 1024; или как-то так, если нет[/uquote]
то что нужно!
этот же вариант использует CMSIS, т. е . самый низкий уровень не считая асм.
я так пытался сделать:
Код: Выделить всё
uint32_t *GPIOA_MODER = 0x40020000UL;
&GPIOA_MODER=1024;
- Реклама
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Вопросы по С/С++ (СИ)
Вот так сработает
Но лучше не страдать ерундой и использовать заголовочный файл контроллера.
Код: Выделить всё
volatile uint32_t *GPIOA_MODER = (uint32_t *)0x40020000UL;
*GPIOA_MODER = 1024;
- ROMan2947
- Грызет канифоль
- Сообщения: 287
- Зарегистрирован: Сб янв 23, 2016 00:59:59
- Откуда: Чебоксары
Re: Вопросы по С/С++ (СИ)
[uquote="VladislavS",url="/forum/viewtopic.php?p=4157199#p4157199"]Но лучше не страдать ерундой и использовать заголовочный файл контроллера.[/uquote]
Я же пока осваиваюсь, хочется понять всю эту магию. HAL штука удобная, но это для пользователя, а не для программиста.
Чего больше придерживаться HAL или CMSIS?
Я же пока осваиваюсь, хочется понять всю эту магию. HAL штука удобная, но это для пользователя, а не для программиста.
Чего больше придерживаться HAL или CMSIS?
Re: Вопросы по С/С++ (СИ)
HAL перспективней.
И это вовсе не для пользователя. Эдак можно сказать, что если не в машкодах в мониторе бэкашки пишу, а таскаю контролы на форму да связываю события, то пользователем являюсь, а не программистом...
И это вовсе не для пользователя. Эдак можно сказать, что если не в машкодах в мониторе бэкашки пишу, а таскаю контролы на форму да связываю события, то пользователем являюсь, а не программистом...
-
linkov1959
- Держит паяльник хвостом
- Сообщения: 923
- Зарегистрирован: Пн сен 10, 2018 19:16:28
Re: Вопросы по С/С++ (СИ)
uint32_t *ptr = 0x40020000; // объявляем указатель
*ptr = 1024; // по адресу указателя пишем новое значение.
*ptr = 1024; // по адресу указателя пишем новое значение.
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
[uquote="ROMan2947",url="/forum/viewtopic.php?p=4157207#p4157207"]Чего больше придерживаться HAL или CMSIS?[/uquote]
Тут "или" не совсем корректно. HAL сам по себе тоже использует заголовочные файлы CMSIS.
По сути, есть несколько вариантов:
1) Вообще без CMSIS, используяэти самые приведения типов, *((volatile uint8_t*)0x40020000) = 1024). Смысла и читабельности кода мало.
2) Подключить библиотеки CMSIS, и писать GPIOA->MODER = 1024;. Выглядит уже понятнее, разницы в размере кода и скорости выполнения не будет.
3) Использовать LL (+CMSIS) (тот же CubeMS позволяет легко выбрать эту альтернативу HAL). Пример может выглядеть уже так: LL_GPIO_SetPinMode(GPIOA, LL_GPIO_PIN_5, LL_GPIO_MODE_OUTPUT); Выглядит ещё понятнее и переносимее между разными МК от STM32. Разницы в размере кода и скорости выполнения не будет.
4) Использовать HAL (+CMSIS). То есть, инициализировать пин через HAL_GPIO_Init(), предварительно прописав все нужные параметры в структуру GPIO_InitTypeDef. Выглядит тоже понятно, максимально переносимо между разными МК от STM32, но за счёт различных внутренних проверок на корректность внутри функции инициализации - гораздо медленнее выполняется и даст больший размер кода. В принципе, для функций инициализации это не так критично.
Я лично для себя пока выбрал вариант 3.
5) Ещё, конечно, можно выбрать альтернативу CMSIS от STM32, вроде того же libopencm3. Потенциально, более легко переносимо между разными семействами ARM Cortex M, но нужно вникать "с нуля".
Тут "или" не совсем корректно. HAL сам по себе тоже использует заголовочные файлы CMSIS.
По сути, есть несколько вариантов:
1) Вообще без CMSIS, используяэти самые приведения типов, *((volatile uint8_t*)0x40020000) = 1024). Смысла и читабельности кода мало.
2) Подключить библиотеки CMSIS, и писать GPIOA->MODER = 1024;. Выглядит уже понятнее, разницы в размере кода и скорости выполнения не будет.
3) Использовать LL (+CMSIS) (тот же CubeMS позволяет легко выбрать эту альтернативу HAL). Пример может выглядеть уже так: LL_GPIO_SetPinMode(GPIOA, LL_GPIO_PIN_5, LL_GPIO_MODE_OUTPUT); Выглядит ещё понятнее и переносимее между разными МК от STM32. Разницы в размере кода и скорости выполнения не будет.
4) Использовать HAL (+CMSIS). То есть, инициализировать пин через HAL_GPIO_Init(), предварительно прописав все нужные параметры в структуру GPIO_InitTypeDef. Выглядит тоже понятно, максимально переносимо между разными МК от STM32, но за счёт различных внутренних проверок на корректность внутри функции инициализации - гораздо медленнее выполняется и даст больший размер кода. В принципе, для функций инициализации это не так критично.
Я лично для себя пока выбрал вариант 3.
5) Ещё, конечно, можно выбрать альтернативу CMSIS от STM32, вроде того же libopencm3. Потенциально, более легко переносимо между разными семействами ARM Cortex M, но нужно вникать "с нуля".
- GARMIN
- Держит паяльник хвостом
- Сообщения: 954
- Зарегистрирован: Вс дек 02, 2012 16:58:33
- Откуда: от туда
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Есть ещё один вариант.
Немножко дописать заголовочный файл, и инициализировать весь порт сразу за четыре команды.
Вот пример:
Немножко дописать заголовочный файл, и инициализировать весь порт сразу за четыре команды.
Вот пример:
Спойлер
Код: Выделить всё
// init pin
RCC->AHBENR |= RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN; // разрешаем тактирование GPIOA и GPIOB
GPIOB->MODER = GPIO_MODER_MODER0_INPUT
| GPIO_MODER_MODER1_INPUT
| GPIO_MODER_MODER2_INPUT
| GPIO_MODER_MODER3_INPUT
| GPIO_MODER_MODER4_INPUT
| GPIO_MODER_MODER5_INPUT
| GPIO_MODER_MODER6_INPUT
| GPIO_MODER_MODER7_INPUT
| GPIO_MODER_MODER8_INPUT
| GPIO_MODER_MODER9_INPUT
| GPIO_MODER_MODER10_INPUT
| GPIO_MODER_MODER11_INPUT
| GPIO_MODER_MODER12_INPUT // PinB12 - input кнопка USER
| GPIO_MODER_MODER13_INPUT
| GPIO_MODER_MODER14_INPUT
| GPIO_MODER_MODER15_INPUT;
GPIOB->OTYPER = GPIO_OTYPER_OT0_PP // pushpull as default
| GPIO_OTYPER_OT1_PP
| GPIO_OTYPER_OT2_PP
| GPIO_OTYPER_OT3_PP
| GPIO_OTYPER_OT4_PP
| GPIO_OTYPER_OT5_PP
| GPIO_OTYPER_OT6_PP
| GPIO_OTYPER_OT7_PP
| GPIO_OTYPER_OT8_PP
| GPIO_OTYPER_OT9_PP
| GPIO_OTYPER_OT10_PP
| GPIO_OTYPER_OT11_PP
| GPIO_OTYPER_OT12_PP // PinB12 - pushpull
| GPIO_OTYPER_OT13_PP
| GPIO_OTYPER_OT14_PP
| GPIO_OTYPER_OT15_PP;
GPIOB->OSPEEDR = GPIO_OSPEEDR_OSPEEDR0_LOW
| GPIO_OSPEEDR_OSPEEDR1_LOW
| GPIO_OSPEEDR_OSPEEDR2_LOW
| GPIO_OSPEEDR_OSPEEDR3_LOW
| GPIO_OSPEEDR_OSPEEDR4_LOW
| GPIO_OSPEEDR_OSPEEDR5_LOW
| GPIO_OSPEEDR_OSPEEDR6_LOW
| GPIO_OSPEEDR_OSPEEDR7_LOW
| GPIO_OSPEEDR_OSPEEDR8_LOW
| GPIO_OSPEEDR_OSPEEDR9_LOW
| GPIO_OSPEEDR_OSPEEDR10_LOW
| GPIO_OSPEEDR_OSPEEDR11_LOW
| GPIO_OSPEEDR_OSPEEDR12_LOW // PinB12 speed low
| GPIO_OSPEEDR_OSPEEDR13_LOW
| GPIO_OSPEEDR_OSPEEDR14_LOW
| GPIO_OSPEEDR_OSPEEDR15_LOW;
GPIOB->PUPDR = GPIO_PUPDR_PUPDR0_NO
| GPIO_PUPDR_PUPDR1_NO
| GPIO_PUPDR_PUPDR2_NO
| GPIO_PUPDR_PUPDR3_NO
| GPIO_PUPDR_PUPDR4_NO
| GPIO_PUPDR_PUPDR5_NO
| GPIO_PUPDR_PUPDR6_NO
| GPIO_PUPDR_PUPDR7_NO
| GPIO_PUPDR_PUPDR8_NO
| GPIO_PUPDR_PUPDR9_NO
| GPIO_PUPDR_PUPDR10_NO
| GPIO_PUPDR_PUPDR11_NO
| GPIO_PUPDR_PUPDR12_UP // PinB12 подтяжка к питанию
| GPIO_PUPDR_PUPDR13_NO
| GPIO_PUPDR_PUPDR14_NO
| GPIO_PUPDR_PUPDR15_NO;Re: Вопросы по С/С++ (СИ)
[uquote="linkov1959",url="/forum/viewtopic.php?p=4157282#p4157282"]uint32_t *ptr = 0x40020000; // объявляем указатель
*ptr = 1024; // по адресу указателя пишем новое значение.[/uquote]И какой же компилятор позволяет такое безобразие?
IAR например вполне закономерно материт:
Да даже если добавить приведение типа, то всё равно компилятор имеет право выкинуть такой код как "не имеющий эффекта".
Уже сказали выше: необходим volatile.
*ptr = 1024; // по адресу указателя пишем новое значение.[/uquote]И какой же компилятор позволяет такое безобразие?
IAR например вполне закономерно материт:
Код: Выделить всё
Error[Pe144]: a value of type "int" cannot be used to initialize an entity of type "uint32_t *" B:\WS1\main.cpp 435 Уже сказали выше: необходим volatile.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18547
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
это что ж такое выходит?! уже надо явно тип константы приводить к типу левостороннего операнда?! а если просто 1 записать или 0 - тоже ругаться будет?!jcxz писал(а):Error[Pe144]: a value of type "int" cannot be used to initialize an entity of type "uint32_t *" B:\WS1\main.cpp 435
наверное, "параноидальный" режим проверки ошибок/варнингов включен...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Вопросы по С/С++ (СИ)
[uquote="ARV",url="/forum/viewtopic.php?p=4157599#p4157599"]наверное, "параноидальный" режим проверки ошибок/варнингов включен...[/uquote]Нет, это просто компилятор в режиме С++, который более строго к типам относится. Посмотрите моё сообщение выше. Я без всяких компиляторов сразу приведение типа использовал.
Re: Вопросы по С/С++ (СИ)
[uquote="Martian",url="/forum/viewtopic.php?p=4155711#p4155711"]И это не избавит от мусора, так как strcpy сделает первый элемент пробелом и во второй элемент занесет ноль - признак конца строки. Логичнее тогда уж присвоить 0, и именно 0, не "0". Это и будет пустая строка. А в этом случае не нужна strcpy.
Но вообще, зная адрес массива и его размер, заполнить эту область чем-то можно кучей способов, например, memset. Наверное, надо конкретно по мк/компилятору смотреть, что будет оптимальней.[/uquote]
сработало
спасибо !
Но вообще, зная адрес массива и его размер, заполнить эту область чем-то можно кучей способов, например, memset. Наверное, надо конкретно по мк/компилятору смотреть, что будет оптимальней.[/uquote]
сработало
спасибо !
Tell Me The Truth
-
linkov1959
- Держит паяльник хвостом
- Сообщения: 923
- Зарегистрирован: Пн сен 10, 2018 19:16:28
Re: Вопросы по С/С++ (СИ)
jcxz, uint32_t *ptr = 0x40020000; // объявляем указатель
*ptr = 1024; // по адресу указателя пишем новое значение.
Проверил в CubeIDE, компилируется и работает в железе.
*ptr = 1024; // по адресу указателя пишем новое значение.
Проверил в CubeIDE, компилируется и работает в железе.
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Вопросы по С/С++ (СИ)
linkov1959, это до поры до времени. Упс...
Re: Вопросы по С/С++ (СИ)
ну дык, вся эта кухня должна оговариваться опциями оптимизатора, а не необходимостью volatile и правами компилятора что-то выкинуть.
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Вопросы по С/С++ (СИ)
Martian, зачем вы переворачиваете с ног на голову? Правильно с volatile и любыми ключами оптимизатора, а не наоборот.
Re: Вопросы по С/С++ (СИ)
Затем, что никто не объясняет механизма. Правильно так, как надо в отдельно взятом случае, в противном случае оптимизатор был бы неотключаем вообще и тотально, и всюду бездумно пихалось бы volatile.


