
Сообщение от
HardWareMan
Т.е., прерывания продолжают стрелять, ок. А RCC гарантированно настроен правильно?
Ты код смотрел? Нет там никаких прерываний. В новой версии (еще не заливал) я даже добавил при инициализации, как у тебя:
Код:
int main(void)
{
clockInit();
portClockInit();
disableGlobalInterrupt();
...
}
// Остановка глобальных прерываний
void disableGlobalInterrupt(void)
{
__asm volatile (
"CPSID f\n"
);
}
Не знаю, достаточно ли этого. И еще не знаю, останавливаются ли таким способом все глобальные прерывания во всем последующем коде, или только в коде функции disableGlobalInterrupt(), а при выходе из нее опять восстанавливаются (слишком сложный STM для меня), просвяти.
И еще я провел два чистых эксперимента. Решил, что коль установка 0x00 оптимизируется, то надо сделать две вещи:
- Собрать весь проект с -O0,
- Устанавливать в первом случае 0x0F вместо 0x00 (все равно мы мониторим старший бит, и при 0x0F в нем так же будет 0), чтобы не срабатывала оптимизация установки 0x00.
Так я и сделал. Сборка с 0x0F и 0xFF стали отличаться только в единственном месте, вот так:
Код:
< 80004b2: b292 uxth r2, r2
< 80004b4: f442 6270 orr.w r2, r2, #3840 ; 0xf00
---
> 80004b2: f062 02ff orn r2, r2, #255 ; 0xff
> 80004b6: b292 uxth r2, r2
Здесь уже можно считать, что эти команды выполняются одинаковое количество тактов. На различное выравнивание кода уже не сошлешься, длина в байтах одинакова.
Странная конструкция orr.w r2, r2, #3840; 0xf00 действительно дает 0x0F, можно сравнить с таким примером:
Код:
LCD_DATA_PORT->BSRR=0x00FF0000 | (sColor&0x00FF);
0x08000bbe: orr.w r7, r7, #16711680 ; 0xff0000
Так что показали эти два чистых эксперимента? Да то же самое. Установка с 1 на 0 дает "провал" в ~120нс. Установка с 0 на 1 дает "полочку" в ~700нс. Объяснить почему так я своим скудным умишком не могу.
Ну и самый первый вопрос остался: почему установка с 1 на 0 такая короткая? По алгоритму отпускание удерживания нуля не может начаться раньше, чем желтая линия вернется к единице. Вначале STM должен увидеть, что /32К или /RD не 0, и только после этого отпустить удерживать 0. А на деле этого не происходит. И почему так - тоже не ясно.
- - - Добавлено - - -

Сообщение от
tnt23
Еще важно, какие оптимизации включены при компиляции (ключи -o в GCC, например).
Выше написал, сделал проверку с -O0.