worklog: STM32 работа с QuadSPI, нашёл аппаратный глюк (?)

Aug 23, 2017 20:13

В некоторых случаях (обнаружил для режима поллинга, но может проявляться и ещё где-то -- не знаю) регистр CCR не обновляется, несмотря на то, что в него явно есть запись.
То есть после операции, например,
QUADSPI->CCR = QIO_FMODE(QIO_POLLING) | QIO_DMODE(QIO_QUAD) | QIO_INSTR(QIO_QUAD, QIO_RDSR);
(я уже немного красивых макросов и энумов написал, чтобы код выглядел лаконичнее) в регистре CCR по прежнему лежит ПРЕДЫДУЩЕЕ значение и алгоритм, ессно, работает совсем не так, как ожидалось.

Долго вертел флаги оптимизации, порядок инструкций, обернул всё в критические секции - ничего из этого не помогло.
Но помогло считывание этого регистра после записи:
uint32_t ccr = 0;
....
....
QUADSPI->CCR = QIO_FMODE(QIO_POLLING) | QIO_DMODE(QIO_QUAD) | QIO_INSTR(QIO_QUAD, QIO_RDSR);
ccr = QUADSPI->CCR;

Вроде теперь работает.

радио

Previous post Next post
Up