Изменять частоту генератора MSI надо так
Код
int RCC_ICSCR_MASK;
RCC_ICSCR_MASK=RCC->ICSCR;
RCC_ICSCR_MASK&=~RCC_ICSCR_MSIRANGE;
RCC_ICSCR_MASK|=RCC_ICSCR_MSIRANGE_64KHz;
RCC->ICSCR=RCC_ICSCR_MASK;
RCC_ICSCR_MASK=RCC->ICSCR;
RCC_ICSCR_MASK&=~RCC_ICSCR_MSIRANGE;
RCC_ICSCR_MASK|=RCC_ICSCR_MSIRANGE_64KHz;
RCC->ICSCR=RCC_ICSCR_MASK;
Т.е сначала копировать весь регистр в переменную, изменять биты в переменной, и потом копировать обратно.
Если менять биты прямо в регистре , даже если при этом недопустимых комбинаций битов не образуется, и даже если в это время
от MSI ничего не тактируется, возникают удивительные глюки :
У меня , при выполении условия : вышли из спящего режима + изменили частоту MSI глохнет генератор LSE !
Причём глохнет он на строчке
RCC->ICSCR|=RCC_ICSCR_MSIRANGE_64KHz; // RCC_ICSCR_MSIRANGE_64KHz==0 !
C битами SW в CFGR наблюдаю в точности такую же ситуацию. Если после выхода из спячки переключать
биты в самом регистре RCC_CFGR то LSE глохнет, бит LSERDY сбрасывается.
Очень долго и мучительно отлавливал глюк : у меня программа всё время переключает частоты и входит/выходит из спящего режима.