Например TDA7294

Форум РадиоКот • Просмотр темы - Вопросы по С/С++ (СИ)
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Вс фев 22, 2026 06:49:21

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 7704 ]     ... , , , 357, , , ...  
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Сб янв 08, 2022 18:36:56 
Грызет канифоль
Аватар пользователя

Карма: 2
Рейтинг сообщений: 10
Зарегистрирован: Сб янв 23, 2016 00:59:59
Сообщений: 287
Откуда: Чебоксары
Рейтинг сообщения: 0
Здравствуйте! захотелось в регистр GPIOA_MODER с адресом 0x4002 0000 записать число 1024. как это должно выглядеть на С.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Сб янв 08, 2022 18:52:21 
Друг Кота
Аватар пользователя

Карма: 86
Рейтинг сообщений: 1035
Зарегистрирован: Чт апр 11, 2013 11:19:59
Сообщений: 4903
Откуда: Минск
Рейтинг сообщения: 0
GPIOA->MODER = 1024; если библиотеки CMSIS подключены
*((uint32_t *)0x40020000) = 1024; или как-то так, если нет


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Сб янв 08, 2022 19:10:00 
Друг Кота

Карма: 29
Рейтинг сообщений: 12
Зарегистрирован: Пт янв 12, 2007 11:21:39
Сообщений: 19192
Откуда: Томск
Рейтинг сообщения: 0
GPIOA->MODER = 1024; если библиотеки CMSIS подключены
*((uint32_t *)0x40020000) = 1024; или как-то так, если нет


volatile забыли)

*((volatile uint32_t *)0x40020000) = 1024;


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Сб янв 08, 2022 19:19:46 
Друг Кота
Аватар пользователя

Карма: 86
Рейтинг сообщений: 1035
Зарегистрирован: Чт апр 11, 2013 11:19:59
Сообщений: 4903
Откуда: Минск
Рейтинг сообщения: 0
Несущественно, сработает и без volatile.


Вернуться наверх
 
Эиком - электронные компоненты и радиодетали
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Сб янв 08, 2022 20:46:49 
Грызет канифоль
Аватар пользователя

Карма: 2
Рейтинг сообщений: 10
Зарегистрирован: Сб янв 23, 2016 00:59:59
Сообщений: 287
Откуда: Чебоксары
Рейтинг сообщения: 0

*((uint32_t *)0x40020000) = 1024;
или как-то так, если нет


то что нужно!
этот же вариант использует CMSIS, т. е . самый низкий уровень не считая асм.

я так пытался сделать:
Код:

uint32_t *GPIOA_MODER = 0x40020000UL;
 &GPIOA_MODER=1024;


не работает.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Сб янв 08, 2022 20:57:39 
Собутыльник Кота
Аватар пользователя

Карма: 18
Рейтинг сообщений: 433
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2559
Рейтинг сообщения: 0
Вот так сработает
Код:
volatile uint32_t *GPIOA_MODER = (uint32_t *)0x40020000UL;
*GPIOA_MODER = 1024;

Но лучше не страдать ерундой и использовать заголовочный файл контроллера.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Сб янв 08, 2022 21:09:27 
Грызет канифоль
Аватар пользователя

Карма: 2
Рейтинг сообщений: 10
Зарегистрирован: Сб янв 23, 2016 00:59:59
Сообщений: 287
Откуда: Чебоксары
Рейтинг сообщения: 0
Но лучше не страдать ерундой и использовать заголовочный файл контроллера.

Я же пока осваиваюсь, хочется понять всю эту магию. HAL штука удобная, но это для пользователя, а не для программиста.

Чего больше придерживаться HAL или CMSIS?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Сб янв 08, 2022 21:13:43 
Друг Кота

Карма: 67
Рейтинг сообщений: 1964
Зарегистрирован: Сб дек 18, 2021 19:25:32
Сообщений: 12867
Рейтинг сообщения: 0
HAL перспективней.
И это вовсе не для пользователя. Эдак можно сказать, что если не в машкодах в мониторе бэкашки пишу, а таскаю контролы на форму да связываю события, то пользователем являюсь, а не программистом...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Сб янв 08, 2022 23:23:10 
Держит паяльник хвостом

Карма: -2
Рейтинг сообщений: 35
Зарегистрирован: Пн сен 10, 2018 19:16:28
Сообщений: 923
Рейтинг сообщения: 0
uint32_t *ptr = 0x40020000; // объявляем указатель
*ptr = 1024; // по адресу указателя пишем новое значение.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вс янв 09, 2022 08:32:23 
Друг Кота
Аватар пользователя

Карма: 86
Рейтинг сообщений: 1035
Зарегистрирован: Чт апр 11, 2013 11:19:59
Сообщений: 4903
Откуда: Минск
Рейтинг сообщения: 1
Чего больше придерживаться HAL или CMSIS?

Тут "или" не совсем корректно. 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, но нужно вникать "с нуля".


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вс янв 09, 2022 13:44:46 
Держит паяльник хвостом
Аватар пользователя

Карма: 16
Рейтинг сообщений: 211
Зарегистрирован: Вс дек 02, 2012 16:58:33
Сообщений: 945
Откуда: от туда
Рейтинг сообщения: 0
Есть ещё один вариант.
Немножко дописать заголовочный файл, и инициализировать весь порт сразу за четыре команды.
Вот пример:
Спойлер
Код:
// 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: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вс янв 09, 2022 13:56:59 
Мудрый кот

Карма: -8
Рейтинг сообщений: 196
Зарегистрирован: Вт авг 15, 2017 10:51:13
Сообщений: 1704
Рейтинг сообщения: 0
uint32_t *ptr = 0x40020000; // объявляем указатель
*ptr = 1024; // по адресу указателя пишем новое значение.
И какой же компилятор позволяет такое безобразие? :shock:
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.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вс янв 09, 2022 14:49:55 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 98
Рейтинг сообщений: 2121
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18473
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
jcxz писал(а):
Error[Pe144]: a value of type "int" cannot be used to initialize an entity of type "uint32_t *" B:\WS1\main.cpp 435
это что ж такое выходит?! уже надо явно тип константы приводить к типу левостороннего операнда?! а если просто 1 записать или 0 - тоже ругаться будет?!
наверное, "параноидальный" режим проверки ошибок/варнингов включен...

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вс янв 09, 2022 16:08:50 
Собутыльник Кота
Аватар пользователя

Карма: 18
Рейтинг сообщений: 433
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2559
Рейтинг сообщения: 0
наверное, "параноидальный" режим проверки ошибок/варнингов включен...
Нет, это просто компилятор в режиме С++, который более строго к типам относится. Посмотрите моё сообщение выше. Я без всяких компиляторов сразу приведение типа использовал.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вс янв 09, 2022 17:37:41 
Друг Кота
Аватар пользователя

Карма: 27
Рейтинг сообщений: 33
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Сообщений: 6296
Откуда: Ukraine
Рейтинг сообщения: 0
И это не избавит от мусора, так как strcpy сделает первый элемент пробелом и во второй элемент занесет ноль - признак конца строки. Логичнее тогда уж присвоить 0, и именно 0, не "0". Это и будет пустая строка. А в этом случае не нужна strcpy.
Но вообще, зная адрес массива и его размер, заполнить эту область чем-то можно кучей способов, например, memset. Наверное, надо конкретно по мк/компилятору смотреть, что будет оптимальней.

сработало
спасибо !

_________________
Tell Me The Truth


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вс янв 09, 2022 20:03:35 
Держит паяльник хвостом

Карма: -2
Рейтинг сообщений: 35
Зарегистрирован: Пн сен 10, 2018 19:16:28
Сообщений: 923
Рейтинг сообщения: 0
jcxz, uint32_t *ptr = 0x40020000; // объявляем указатель
*ptr = 1024; // по адресу указателя пишем новое значение.
Проверил в CubeIDE, компилируется и работает в железе.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вс янв 09, 2022 20:27:52 
Собутыльник Кота
Аватар пользователя

Карма: 18
Рейтинг сообщений: 433
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2559
Рейтинг сообщения: 0
linkov1959, это до поры до времени. Упс...
Изображение
Вложение:
ups.png [27.2 KiB]
Скачиваний: 230


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вс янв 09, 2022 20:38:44 
Друг Кота

Карма: 67
Рейтинг сообщений: 1964
Зарегистрирован: Сб дек 18, 2021 19:25:32
Сообщений: 12867
Рейтинг сообщения: 0
ну дык, вся эта кухня должна оговариваться опциями оптимизатора, а не необходимостью volatile и правами компилятора что-то выкинуть.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вс янв 09, 2022 20:43:48 
Собутыльник Кота
Аватар пользователя

Карма: 18
Рейтинг сообщений: 433
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2559
Рейтинг сообщения: 0
Martian, зачем вы переворачиваете с ног на голову? Правильно с volatile и любыми ключами оптимизатора, а не наоборот.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вс янв 09, 2022 20:47:43 
Друг Кота

Карма: 67
Рейтинг сообщений: 1964
Зарегистрирован: Сб дек 18, 2021 19:25:32
Сообщений: 12867
Рейтинг сообщения: 0
Затем, что никто не объясняет механизма. Правильно так, как надо в отдельно взятом случае, в противном случае оптимизатор был бы неотключаем вообще и тотально, и всюду бездумно пихалось бы volatile.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 7704 ]     ... , , , 357, , , ...  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 287


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y