whale 6 3 февраля, 2021 Опубликовано 3 февраля, 2021 · Жалоба 2 hours ago, Reflector said: *(volatile uint8_t*)&GPIOA->ODR = data; Не понял как это работает можно слегка осветить ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrBearManul 0 4 февраля, 2021 Опубликовано 4 февраля, 2021 · Жалоба 1 час назад, whale сказал: Не понял как это работает можно слегка осветить ? Это приведение указателя на 16 бит к указателю на 8 бит. Соотетственно данные по такому указателю могут быть записаны только восьмибитные, т.е. char в вашем случае. Почитайте книжку по Си, например эту. У вас множество вопросов, ещё и не заданных, найдёт ответы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Darth Vader 0 4 февраля, 2021 Опубликовано 4 февраля, 2021 · Жалоба Может не сработать. Для многой периферии есть ограничение на разрядность записываемых/считываемых данных. Надо убедиться, что регистры порта допускают запись отдельных байт. Может там есть обязательное условие про доступ только 32-битными или 16-битными словами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrBearManul 0 4 февраля, 2021 Опубликовано 4 февраля, 2021 · Жалоба 1 час назад, Darth Vader сказал: Может не сработать Верно! Но это уже автору проверять и уточнять. В любом случае чтение доки помогает. Ну можно ещё эксперименты поставить. На все мелкие вопросы ответы на форуме дать невозможно. Нужны хотя бы исходные данные: попробовал так-то и так-то, получил это и это. Ну и книги ему нужно читать. Тогда сразу покроет большое количество вопросов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 4 февраля, 2021 Опубликовано 4 февраля, 2021 · Жалоба 1 час назад, Darth Vader сказал: Может не сработать Как это? Порт указан, контроллер угадан. Что там может не сработать? Не сработает на F1, но речь не про него. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 4 февраля, 2021 Опубликовано 4 февраля, 2021 · Жалоба В общем случае может не сработать (конкретные примеры привести?). В данном случае Цитата The peripheral registers can be written in word, half word or byte mode. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 4 февраля, 2021 Опубликовано 4 февраля, 2021 · Жалоба 27 минут назад, adnega сказал: В общем случае может не сработать (конкретные примеры привести?). Примеров я и сам могу привести. В том числе и из Errata. Только ни о каком общем случае речи не было. Вопрос стоял конкретный: Цитата Как проще всего закинуть в порт GPIOA->ODR char данные в первые 8 бит но не трогать все остальные ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
whale 6 4 февраля, 2021 Опубликовано 4 февраля, 2021 (изменено) · Жалоба Вариант adnega мне нравиться больше, а если нужно не 8 бит а 5 или 3 записать тут с указателем уже не прокатит. По моему нагляднее всего через промежуточный регистр на 16 Изменено 4 февраля, 2021 пользователем whale Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 4 февраля, 2021 Опубликовано 4 февраля, 2021 · Жалоба Что значит нравится, не нравится? Был КОНКРЕТНЫЙ вопрос, дан КОНКРЕТНЫЙ ответ. 42 минуты назад, whale сказал: а если нужно не 8 бит а 5 или 3 Это уже другая задача. Которая в общем виде решается так using pVU8 = volatile uint8_t*; using pVU16 = volatile uint16_t*; using pVU32 = volatile uint32_t*; template<uint32_t PM> static inline void write(uint32_t data) { if constexpr (PM==0) return; if constexpr (PM == 0xFFFF) base()->ODR = data; else if constexpr (PM == 0x00FF) *pVU8(&base()->ODR) = data; else if constexpr (PM == 0xFF00) *(pVU8(&base()->ODR) + 1) = data >> 8; else base()->BSRR = (PM << 16) | (data & PM); } //Оптимизация записи по маске 32-битного регистра с возможностью 8 и 16-битного доступа template<uint32_t mask> static inline void writeReg32(pVU32 reg, uint32_t value) { if constexpr (mask==0) return; if constexpr (mask == 0xFFFF'FFFF) *reg = value; else if constexpr (mask == 0x0000'FFFF) *pVU16(reg) = value; else if constexpr (mask == 0xFFFF'0000) *(pVU16(reg) + 1) = value >> 16; else if constexpr (mask == 0x0000'00FF) *pVU8(reg) = value; else if constexpr (mask == 0x0000'FF00) *(pVU8(reg) + 1) = value >> 8; else if constexpr (mask == 0x00FF'0000) *(pVU8(reg) + 2) = value >> 16; else if constexpr (mask == 0xFF00'0000) *(pVU8(reg) + 3) = value >> 24; else if constexpr ((mask & 0xFFFF'FF00)==0) *pVU8(reg) = (*pVU8(reg) & ~mask) | value; else if constexpr (!(mask & 0xFFFF'00FF)) *(pVU8(reg) + 1) = (*(pVU8(reg) + 1) & ~(mask >> 8)) | (value >> 8); else if constexpr (!(mask & 0xFF00'FFFF)) *(pVU8(reg) + 2) = (*(pVU8(reg) + 2) & ~(mask >> 16)) | (value >> 16); else if constexpr (!(mask & 0x00FF'FFFF)) *(pVU8(reg) + 3) = (*(pVU8(reg) + 3) & ~(mask >> 24)) | (value >> 24); else if constexpr (!(mask & 0xFFFF'0000)) *pVU16(reg) = (*pVU16(reg) & ~mask) | value; else if constexpr (!(mask & 0x0000'FFFF)) *(pVU16(reg) + 1) = (*(pVU16(reg) + 1) & ~(mask >> 16)) | (value >> 16); else *reg = (*reg & ~mask) | value; } Но вы же не об этом спрашивали. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 4 февраля, 2021 Опубликовано 4 февраля, 2021 · Жалоба 41 минуту назад, whale сказал: Вариант adnega Мой вариант тоже не идеал. На самом деле Цитата If both BSx and BRx are set, BSx has priority. Поэтому можно вместо GPIOA->BSRR = (x & 0xFF) | (((~x) & 0xFF) << 16) делать GPIOA->BSRR = (x & 0xFF) | (0xFF << 16) Можно обернуть все в #define в Си или в шаблон на Си++. Кста, шаблон на Си++ может еще и самым лучшим образом превратить конкретную ситуацию в конкретные инструкции (см. пример VladislavS) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
whale 6 4 февраля, 2021 Опубликовано 4 февраля, 2021 (изменено) · Жалоба Понятно, спасибо. Изменено 4 февраля, 2021 пользователем whale Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
whale 6 4 февраля, 2021 Опубликовано 4 февраля, 2021 (изменено) · Жалоба del Изменено 4 февраля, 2021 пользователем whale Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
blackfin 24 4 февраля, 2021 Опубликовано 4 февраля, 2021 · Жалоба Теоре́ма о бесконе́чных обезья́нах похоже наполнилась новыми смыслами.. :) Quote Абсолютно случайным образом ударяя по клавишам пишущей машинки, гипотетическая обезьяна рано или поздно напечатает одну из пьес Шекспира Наша новая пьеса носит название "Прерывания таймера".. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться