STM32: тактирование и запуск Печать
Добавил(а) microsin   

Выбор тактов осуществляется программно в момент запуска системы (startup), однако следует иметь в виду, что после сброса по умолчанию в качестве тактовой частоты CPU используется внутренний RC-генератор 8 МГц. В этой статье описывается пример настройки тактирования и запуска на основе библиотеки CMSIS. Неизвестные термины и сокращения см. в статье [1].

Может быть выбрана внешняя тактовая частота 4 .. 16 МГц, в этом случае переход на новое тактирование мониторится на предмет успешного завершения. Если определен отказ переключения на внешнее тактирование, система автоматически переключится обратно на внутренний RC-генератор, и генерируется программное прерывание, если это разрешено. Подобным образом, если это необходимо, доступно полное управление прерываниями блока PLL (например, при отказе косвенно используемого внешнего кварца, резонатора или генератора).

Несколько прескалеров позволяют конфигурировать частоту AHB, высокоскоростной APB (APB2) и низкоскоростной APB (APB1). Максимальная частота доменов AHB и высокоскоростной APB 72 МГц. Максимальная частота низкоскоростного домена APB 36 МГц. См. рис. 1, где показаны подробности организации дерева частот.

STM32F103 Clock Tree fig01

Рис. 1. Дерево тактов STM32F103.

Легенда рис. 1:

HSE high-speed external clock signal (высокоскоростной сигнал внешнего тактирования).
HSI high-speed internal clock signal (высокоскоростной сигнал внутреннего тактирования).
LSE low-speed external clock signal (низкоскоростной сигнал внешнего тактирования).
LSI low-speed internal clock signal (низкоскоростной сигнал внутреннего тактирования).

Примечания:

1. Когда HSI используется в качестве тактового входа PLL, максимальная тактовая частота системы может достигать 64 МГц.
2. Для запуска функции USB должны быть разрешены и HSE, и PLL, с работающим USBCLK на частоте 48 МГц.
3. Чтобы обеспечить время преобразования АЦП 1 мкс, APB2 должна быть установлена на 14 МГц, 28 МГц или 56 МГц.

[Пример настойки тактирования от кварца 8 МГц]

Настроить тактирование в момент запуска (сразу после сброса, перед входом в главный цикл функции main) можно с помощью функции SystemInit, которая находится в модуле system_stm32f10x.c библиотеки CMSIS. Эта функция вызывает в свою очередь функцию SetSysClock, которая требует предварительного определения одного из макросов SYSCLK_FREQ_HSE, SYSCLK_FREQ_24MHz, SYSCLK_FREQ_36MHz, SYSCLK_FREQ_48MHz, SYSCLK_FREQ_56MHz или SYSCLK_FREQ_72MHz.

Ниже показан выбор системной тактовой частоты 72 МГц, допускающий использование интерфейса USB:

/*!< Раскомментируйте одну из следующих строк, которая соответствует
     выбираемой системной тактовой частоте (SYSCLK).
   
   Важные замечания:
   ================
   1. После каждого сброса по умолчанию в качестве источника тактов используется HSI.
 
   2. Убедитесь, что выбранная SYSCLK не превышает максимально допустимую частоту.
 
   3. Если не определено ни одно из следующих определений, то в качестве источника
      SYSCLK используется HSI.
 
   4. Предоставленная реализация в библиотеке функций конфигурирования SYSCLK
      подразумевает следующее:
        - Устройства классов Low, Medium и High density используют кварц 8 МГц
          для запуска генератора системной тактовой частоты.
        - Для устройств класса Connectivity используется внешний кварцевый
          генератор (или кварц) 25 МГц.
   Если Вы используете другие кварцевые резонаторы, то потребуется необходимая
   адаптация библиотечных функций.
    */
/* #define SYSCLK_FREQ_HSE    HSE_Value */
/* #define SYSCLK_FREQ_24MHz  24000000 */
/* #define SYSCLK_FREQ_36MHz  36000000 */
/* #define SYSCLK_FREQ_48MHz  48000000 */
/* #define SYSCLK_FREQ_56MHz  56000000 */
#define SYSCLK_FREQ_72MHz  72000000

Пример настройки системной тактовой частоты в функции main:

void main(void)
{
   ENTR_CRT_SECTION();
 
   // Настройка системы STM32 (конфигурация тактирования, PLL и Flash):
   SystemInit();
   // Настройка тестовых светодиодов:
   LEDs_init();
   // Настройка входов кнопок:
   S2S3_init();
 
   // Инициализация NVIC:
#ifndef  EMB_FLASH
   /* Установка базового адреса таблицы векторов прерываний на 0x20000000 */
   NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else  /* VECT_TAB_FLASH  */
   /* Установка базового адреса таблицы векторов прерываний на 0x08000000 */
   NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
 
   EXT_CRT_SECTION();
 
   while(1)
   {
      // Действия программы в бесконечном цикле:
      ...
   }
}

[Ссылки]

1. STM32: аббревиатуры и термины.