Перейти к содержанию
    

Не выходит из прерывания таймера

2 hours ago, Reflector said:

 

*(volatile uint8_t*)&GPIOA->ODR = data;

Не понял как это работает можно слегка осветить ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

1 час назад, whale сказал:

Не понял как это работает можно слегка осветить ?

Это приведение указателя на 16 бит к указателю на 8 бит. Соотетственно данные по такому указателю могут быть записаны только восьмибитные, т.е. char в вашем случае. Почитайте книжку по Си, например эту. У вас множество вопросов, ещё и не заданных, найдёт ответы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может не сработать. Для многой периферии есть ограничение на разрядность записываемых/считываемых данных. Надо убедиться, что регистры порта допускают запись отдельных байт. Может там есть обязательное условие про доступ только 32-битными или 16-битными словами.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, Darth Vader сказал:

Может не сработать

Верно! Но это уже автору проверять и уточнять. В любом случае чтение доки помогает. Ну можно ещё эксперименты поставить. На все мелкие вопросы ответы на форуме дать невозможно. Нужны хотя бы исходные данные: попробовал так-то и так-то, получил это и это. Ну и книги ему нужно читать. Тогда сразу покроет большое количество вопросов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, Darth Vader сказал:

Может не сработать

Как это? Порт указан, контроллер угадан. Что там может не сработать? Не сработает на F1, но речь не про него.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В общем случае может не сработать (конкретные примеры привести?).

В данном случае

Цитата

The peripheral registers can be written in word, half word or byte mode.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

27 минут назад, adnega сказал:

В общем случае может не сработать (конкретные примеры привести?).

Примеров я и сам могу привести. В том числе и из Errata. Только ни о каком общем случае речи не было. Вопрос стоял конкретный:

Цитата

Как проще всего закинуть в порт GPIOA->ODR char данные

в первые 8 бит но не трогать все остальные ?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вариант adnega 

мне нравиться больше, а если нужно не 8 бит а 5 или 3  записать тут с указателем уже не прокатит.

По моему нагляднее всего через промежуточный регистр на 16

Изменено пользователем whale

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что значит нравится, не нравится? Был КОНКРЕТНЫЙ вопрос, дан КОНКРЕТНЫЙ ответ. 

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;
}

Но вы же не об этом спрашивали.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Теоре́ма о бесконе́чных обезья́нах похоже наполнилась новыми смыслами.. :)

Quote

Абсолютно случайным образом ударяя по клавишам пишущей машинки, гипотетическая обезьяна рано или поздно напечатает одну из пьес Шекспира

 

Наша новая пьеса носит название "Прерывания таймера"..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...