Компилятор в праве удалить любые переменные и операции с ними - если они ограничиваются областью видимости функции.
Область видимости функции ограничена скобками самой функции, буквально. По этому любая запись во внешнюю переменную будет безусловной, и на неё необязательно вешать __IO.
Я немного понимаю в программировании. Но из этого вообще ничего не понял.
Постарайся раскидать функции по уровням и типу действия. Например RCC_Cfg() и GPIO_test_cfg() относятся к предварительным настройкам МК, этим функциям самое место в SystemInit() или что-то подобное - то вызывается до main.c.
Тут, пожалуй, соглашучь. Но для любителя это не обязательно. Считать что "жизнь начинается с main" для С-программиста вполне нормальная практика. Качество кода это как-то заметно не ухудшает.
WS2812_init() и всё связанное с WS2812 - должно иметь свой файл, без лишних торчащих ушей.
Иметь файл, торчащие уши... Вы о чём вообще? Человек и так не профи, да ещё жаргон какой-то понять надо.
Делать буфер для WS2812 глобальным - очень плохая идея, он должен быть виден там где используется, и больше нигде.
А каки же как не глобальным он должен быть? Вы, наверное, глобальность с областью видимости путаете? Так тут одна единица трансляции, куда что прятать?
Тогда станет доступной возможность оперативно менять количество светодиодов, без смены алгоритма и переписывания части кода.
Это зависит от алгоритма, а не от глобальности или области видимости буфера.
По мне, так только запутали бедного ТС. Дайте ему с алгоритмом для начала разобраться.
Добавлено after 4 minutes 29 seconds:Про BSRR я знаю, что только для записи 1 (биты 0-15 для установки, а 16-31 для сброса) , так и в коде у меня только запись единички в этот регистр или про BSRR я опять не правильно понимаю?
По поводу SR записью 0, а логическое & инвертированного TIM_SR_UIF разве не есть запись нолика?
Ну тогда всё ещё хуже. Стоит открыть учебник по С раздел про операторы |= и &= - удивитесь.