Есть ли способ (например, встроенная функция) создать хранилище байтов (strb), используя C/C++ с gcc?
Для следующей инструкции gcc обязательно использует 32-битное хранилище (str) в регистре.
USART1->TDR = 0x01;
Это правильно, потому что старшие биты регистра не используются и им присваивается значение 0 (значение сброса, как указано в ARM Ref-Manual, правильное).
Можно ли использовать (встроенную) функцию gcc для запуска хранилища байтов (strb) в ARM-Assembler?
Какова цель?





Если вы разыменуете указатель uint8_t, будет сгенерирована инструкция strb.
uint8_t* ptr = ...;
*ptr = 42;
Смотрите также: https://godbolt.org/z/n8v1vcafz
Вы не должны делать это для регистров STM32, поскольку к ним необходимо обращаться с помощью словесных (32-битных) операций. В противном случае поведение не определено.
Откуда вы взяли информацию, что доступ к 32-битным регистрам STM с помощью strb приводит к UB? UB — это термин C/C++. Я думаю, вы имеете в виду, что это не указано на стороне HW. Можете ли вы дать мне ссылку, что это не разрешено STM32 или другим микроконтроллерам?
32-битный доступ является общим правилом. Вот почему все отображаемые в память регистры STM32 определяются как volatile uint32_t*. Если разрешен полусловный или даже байтовый доступ, это обычно упоминается в начале главы о регистре XXX в справочном руководстве микроконтроллера. Найдите «доступ». Помните: отображаемые в память регистры не реализуются как память. Вместо этого периферийное устройство слушает внутреннюю шину и действует, если появляется соответствующий адрес.
Вот ссылка на основные концепции ввода-вывода с отображением памяти: developer.arm.com/documentation/102618/0100/Basic-concepts.
Хорошо, спасибо за подсказку к документу! Например. для STM32G431 DR SPI/I2S может быть доступен побайтно, тогда как DR I2C и USART не могут. Может баг документа? Только что проверил для любопытства с помощью USART TDR, и он работает ...
Разыгрывание
volatile uint8_t *?