Я не вылизывал код, сейчас некогда и незачем этим заниматься. В
данном случае это лайфхак: 1. При оптимизированном коде переменная
существует в стеке и ее можно посмотреть дебаггером. 2. (теория)
Некоторые реализации uart/usart требуют обязательного а. считывания
статус-регистра. б. считывания гарантированно ДО чтения
дата-регистра. в. Читать надо один раз. Для того чтобы обеспечить
именно эти гарантии а-ля asm (а не вообще всегда) и убрать
нежелательные оптимизации и создать
гарантированные sequence
point, даже локальные переменные в которые читается из регистров объявляются volatile. Обращаю внимание - именно эти гарантии, а не вообще всегда.
3. Отлаживался, смотрел что происходит, думал что есть проблема с правильным чтением ST UART, чтобы заведомо избежать грабель объявил как volatile.
Как-то так.