HAL перспективней. И это вовсе не для пользователя. Эдак можно сказать, что если не в машкодах в мониторе бэкашки пишу, а таскаю контролы на форму да связываю события, то пользователем являюсь, а не программистом...
Тут "или" не совсем корректно. 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, но нужно вникать "с нуля".
uint32_t *ptr = 0x40020000; // объявляем указатель *ptr = 1024; // по адресу указателя пишем новое значение.
И какой же компилятор позволяет такое безобразие? 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.
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 - тоже ругаться будет?! наверное, "параноидальный" режим проверки ошибок/варнингов включен...
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
наверное, "параноидальный" режим проверки ошибок/варнингов включен...
Нет, это просто компилятор в режиме С++, который более строго к типам относится. Посмотрите моё сообщение выше. Я без всяких компиляторов сразу приведение типа использовал.
И это не избавит от мусора, так как strcpy сделает первый элемент пробелом и во второй элемент занесет ноль - признак конца строки. Логичнее тогда уж присвоить 0, и именно 0, не "0". Это и будет пустая строка. А в этом случае не нужна strcpy. Но вообще, зная адрес массива и его размер, заполнить эту область чем-то можно кучей способов, например, memset. Наверное, надо конкретно по мк/компилятору смотреть, что будет оптимальней.
jcxz, uint32_t *ptr = 0x40020000; // объявляем указатель *ptr = 1024; // по адресу указателя пишем новое значение. Проверил в CubeIDE, компилируется и работает в железе.
Затем, что никто не объясняет механизма. Правильно так, как надо в отдельно взятом случае, в противном случае оптимизатор был бы неотключаем вообще и тотально, и всюду бездумно пихалось бы volatile.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 287
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения