Управление тактированием: различия между версиями

Материал из MIK32 микроконтроллер
(Исправлены опечатки и ошибки переноса.)
(изменено управление тактирования с помощью регистров на hal библиотеку)
Строка 1: Строка 1:


В основе работы любого микроконтроллер лежит процесс тактирования.
В основе работы любого микроконтроллера лежит процесс тактирования.


'''Тактирование''' - это процесс подачи тактовых импульсов генератором.
'''Тактирование''' это процесс подачи тактовых импульсов генератором. Этот процесс необходим для синхронизации всех процессов в микроконтроллере.


Этот процесс необходим для синхронизации всех процессов в мк
'''Тактовая частота микроконтроллера''' — количество тактов, которые выполняет микроконтроллер в секунду. От частоты зависит эффективность микроконтроллера.


Тактовая частота микроконтроллера - количество тактов, которые выполняет микроконтроллер, в секунду. От частоты зависит эффективность микроконтроллера.  
Чем больше тактовая частота микроконтроллера, тем большее количество операций он может выполнить за одну секунду. Она определяет порядок и скорость выполнения операций устройства.


Чем больше тактовая частота МК, тем большее количество операций он может выполнить за одну секунду. Она определяет порядок и скорость выполнения операций устройства.
Тактовые импульсы можно подавать двумя способами: через внутренний и внешний генератор.[[Файл:Схема тактирования .jpg|мини]]
 
 
'''Схема тактирования'''
[[Файл:Схема тактирования .jpg|мини|894x894пкс]]
 
 
 
Тактовые импульсы можно подавать двумя способами через внутренней и внешний генератор.


Существует несколько типов тактовых резонаторов:
Существует несколько типов тактовых резонаторов:


# RC-цепи
#RC-цепи
# Керамичсекие резонаторы
#Керамичсекие резонаторы
# Кварцевые резонаторы
# Кварцевые резонаторы


Микроконтроллер MIK32 оснащен четырьмя генераторами, два на основе внешнего кварцевого резонатора и два на встроенном контуре RC.
Микроконтроллер MIK32 оснащен четырьмя генераторами, два на основе внешнего кварцевого резонатора и два на встроенном контуре RC.


* Внешние генераторы
*Внешние генераторы  
** OSC32K генератор с выводами для подключения внешнего часового кварцевого резонатора;
**OSC32K генератор с выводами для подключения внешнего часового кварцевого резонатора;
** OSC32M генератор с выводами для подключения внешнего кварцевого резонатора для тактирования системы с частотой от 1 до 32 МГц (генератор по-умолчанию);
** OSC32M генератор с выводами для подключения внешнего кварцевого резонатора для тактирования системы с частотой от 1 до 32 МГц (генератор по-умолчанию);
* Внутренние генераторы
*Внутренние генераторы
** HSI32M встроенный генератор с частотой 32 МГц с возможностью корректировки частоты;
**HSI32M встроенный генератор с частотой 32 МГц с возможностью корректировки частоты;
** LSI32K встроенных генератора с частотой 32 кГц с возможностью корректировки частоты;
**LSI32K встроенных генератора с частотой 32 кГц с возможностью корректировки частоты;
* монитор частоты, предназначен для контроля состояния источников тактирования во время работы микроконтроллера;
*монитор частоты, предназначен для контроля состояния источников тактирования во время работы микроконтроллера;
 
 
 
'''Управление тактированием'''
 
Для выбора источников тактирования, задания делителей частоты, управлением HSI32M и OSC32M используются регистры модулей ''PowerManager'' и ''WakeUp''.
 
Для управления тактированием часов реального времени и управлением LSI32K и OSC32K используются регистры модуля WakeUp.


== '''Управление тактированием'''==
При включении питания и по внешнему сбросу:
При включении питания и по внешнему сбросу:
*тактирование осуществляется от внешнего осциллятора 32 МГц (OSC32M);
*значения делителей шин AHB, APB_M, APB_P равны 0, то есть указанные шины работают на частоте осциллятора;
*тактирование RAM, EEPROM, SPIFI, PowerManager, WakeUp включено, тактирование остальных устройств выключено;
*тактирование сторожевого таймера осуществляется от встроенного осциллятора 32 МГц;
*внешние осцилляторы OSC32K и OSC32M включены. Перед использованием внешнего осциллятора его необходимо включить записью «0» в поле OCS32M;
Для управления тактированием в микроконтроллере в сегрегированном файле main.c необходимо подключить библиотеку "mik32_hal_PCC.h" и создать функцию SystemClock_Config с вызовом ее в main.
{{#spoiler:show=Развернуть код|hide=Свернуть код|<syntaxhighlight lang="c" line="1">
#include "mik32_hal_PCC.h"


* тактирование осуществляется от внешнего осциллятора 32 МГц (OSC32M);
void SystemClock_Config(void);
* значения делителей шин AHB, APB_M, APB_P равны 0, то есть указанные шины работают на частоте осциллятора;
* тактирование RAM, EEPROM, SPIFI, PowerManager, WakeUp включено, тактирование остальных устройств выключено;
* тактирование сторожевого таймера осуществляется от встроенного осциллятора 32 МГц;
* внешние осцилляторы OSC32K и OSC32M включены. Перед использованием внешнего осциллятора его необходимо включить записью «0» в поле OCS32M;


Перед использованием внешнего осциллятора его необходимо включить запи- сью «0» в поле OCS32M_en регистра Generator блока WakeUp.
void main(){
    SystemClock_Config();
    /* code */
}


При необходимости, для снижения потребления встроенный осциллятор 32 MГц выключен путем записи «1» в поле RC32M_en регистра Generator блока PM.  
void SystemClock_Config(void)
{
    PCC_InitTypeDef PCC_OscInit = {0};
    PCC_OscInit.OscillatorEnable = PCC_OSCILLATORTYPE_ALL;
    PCC_OscInit.FreqMon.OscillatorSystem = PCC_OSCILLATORTYPE_OSC32M;
    PCC_OscInit.FreqMon.ForceOscSys = PCC_FORCE_OSC_SYS_UNFIXED;
    PCC_OscInit.FreqMon.Force32KClk = PCC_FREQ_MONITOR_SOURCE_OSC32K;
    PCC_OscInit.AHBDivider = 0;
    PCC_OscInit.APBMDivider = 0;
    PCC_OscInit.APBPDivider = 0;
    PCC_OscInit.HSI32MCalibrationValue = 128;
    PCC_OscInit.LSI32KCalibrationValue = 128;
    PCC_OscInit.RTCClockSelection = PCC_RTC_CLOCK_SOURCE_AUTO;
    PCC_OscInit.RTCClockCPUSelection = PCC_CPU_RTC_CLOCK_SOURCE_OSC32K;
    HAL_PCC_Config(&PCC_OscInit);
}
</syntaxhighlight>
}}Значение параметра OscillatorEnable отвечает за активацию источников тактирования в микроконтроллере.


Для подстройки встроенного осциллятора HSI32M используются поправочные коэффициент с допустимым значением от 0 до 255.  
FreqMon.OscillatorSystem выбирает основной источник тактирования микроконтроллера.


Для подстройки встроенного осциллятора LSI32K используются поправочные коэффициент с допустимым значением от 0 до 255.  
FreqMon.ForceOscSys позволяет или запрещает автоматическое изменение основного источника тактирования при отсутствии сигнала на нём.


Описание полей регистров модуля WU для управления тактированием пред- ставлено в таблице 1.
FreqMon.Force32KClk предназначен для назначения опорного источника тактирования монитора частоты.


Описание полей регистров модуля PM для управления тактированием представлено в таблице 2.
AHBDivider, APBMDivider, APBPDivider задают делитель частоты шин AHB, APB_М и APB_P соответственно.


'''Таблица 1. Регистры и поля управления тактированием модуля WU'''
Частоты сигналов на шинах рассчитываются по следующим формулам:
 
{| class="wikitable"
|+
!Регистр
!Смешение
!Обозначение
!Номер разряда
!Описание
|-
| rowspan="4" |CLOCKS_SYS
| rowspan="4" |0х14
|OSC32M_EN
|[0]
|Включение/отключение внешнего осцилятора
0 – включение;
1 – отключение
|-
|HSI32M_EN
|[1]
|Включение/отключение HSI32M
0 – включение;
1 – отключение
|-
|ADJ_HSI32M
|[9:2]
|Поправочные коэффициенты HSI32M
|-
|FORCE_32K_CLK
|[11:10]
|Принудительное переклю- чение на опорный источник для монитора частоты
2’b01 – принудительно выбран OSC32K
2’b10 – принудительно выбран LSI32K
|-
| rowspan="5" |CLOCKS_BU
| rowspan="5" |0х10
|OSC32K_EN
|[0]
|Включение/отключение внешнего осцилятора на 32 KГц
0 – включение;
1 – отключение
|-
|LSI32K_EN
|[1]
|Включение/отключение LSI32К
0 – включение;
1 – отключение
|-
|ADJ_LSI32K
|[9:6]
|Поправочные коэффициенты LSI32К
|-
|RTC_CLK_MUX
|[11:10]
|Выбор источника тактирования часов реального времени:
0x1 – внутренний LSI32К;
1x2 – внешний осциллятор OSC32K
|-
|OSC32K_SM
|[14]
|Режим повышенного потребления, активный уровень “0” для OSC32K
|}
'''Таблица 2. Регистры управления тактированием модуля PM'''
{| class="wikitable"
|+
!Регистр
!Смешение
!Обозначение
!Номер разряда
!Описание
|-
|DIV_AHB
|0x00
|DIV_AHB
|[7:0]
|Делитель частоты AHB
|-
|DIV_APB_M
|0x04
|DIV_APB_M
|[7:0]
|Делитель частоты APB_M
|-
|DIV_APB_P
|0x08
|DIV_APB_P
|[7:0]
|Делитель частоты APB_P
|-
| rowspan="2" |AHB_MUX
| rowspan="2" |0x24
|AHB_CLK_MUX
|[1:0]
|Выбор источника тактирования системы:
0 – внешний OSC32M;
1 – внутренний OSC32M;
2 – внешний OSC32K;
3 – внутренний OSC32К
|-
|FORCE_MUX
|[3]
|Запрет на принудительное переключение с выбранеого источника тактирования при пропадании тактирования
|-
|WDT_CLK_MUX
|0x28
|WDT_CLK_MUX
|[1:0]
|Выбор источника тактирования сторожевого таймера:
0 – внешний OSC32M;
1 – внутренний HSI32M;
2 – внешний OSC32K;
3 – внутренний LSI32К;
|-
|CLK_AHB_SET
CLK_AHB_CLEAR
|0x0C
0x10
|CLK_AHB_SET
CLK_AHB_CLEAR
|[7:0]
|Управление тактированием устройств на шине AHB.
Запись «1» в CLK_AHB_SET включает тактирования, запись «1» в CLK_AHB_CLEAR отключает тактирование. Каждому биту соответствует одно устройство:
0 – Ядро;
1 – RAM;
2 – EEPROm;
3 – SPIFI;
4 – DMA;
5 – TCB;
6 – ускоритель криптографии;
7 – CRC32
|-
|CLK_APB_M_SET
CLK_APB_M_CLEAR
|0x14
0x18
|CLK_APB_M_SET
CLK_APB_M_CLEAR
|[8:0]
|Управление тактированием устройств на шине APB_M.
Запись «1» в Clk_ APBm_Set включает тактирование, запись «1» в CLK_APB_M_CLEAR отключает тактирование.


Каждому биту соответствует одно устройство:
FAHB = FИСТОЧНИКА / (AHBDivider + 1),


0 – Блок управления питанием (PM - Power Monitor);
FAPB_М = FAHB / (APBMDivider + 1),


1 – контроллер прерываний;
FAPB_P = FAHB / (APBPDivider + 1).


2 – таймер32_0;
Для настройки встроенного осциллятора HSI32M используются поправочные коэффициенты с допустимым значением от 0 до 255.


3 – контроллер выводов;
Для настройки встроенного осциллятора LSI32K используются поправочные коэффициенты с допустимым значением от 0 до 255.


4 – Сторожевой таймер шины
RTCClockSelection используется для назначения приоритетного источника тактирования модуля RTC.


5 – OTP;
RTCClockCPUSelection используется для назначения приоритетного источника тактирования RTC в составе ядра.


6 – монитор питания системного домена
Описание полей модуля управления тактированием представлено в таблице 1.


7 – блок WU батарейного домена
'''Таблица 1. Поля управления модуля тактирования'''


8 – RTC батарейного домена
{| class="wikitable"
|+
! colspan="2" |Поле
!Значения
|-
|-
|CLK_APB_P_SET
| colspan="2" |OscillatorEnable
CLK_APB_P_CLEAR
|PCC_OSCILLATORTYPE_HSI32M — Внутренний источник тактирования 32МГц;
|0x1C
0x20
|CLK_APB_P_SET
CLK_APB_P_CLEAR
|[16:0]
|Управление тактированием устройств на шине APB_P.


Запись «1» в Clk_ APBp_Set включает тактирование, запись «1» в CLK_APB_P_CLEAR отключает тактирование.
PCC_OSCILLATORTYPE_OSC32M — Внешний источник тактирования 32МГц; 


Каждому биту соответствует одно устройство:
PCC_OSCILLATORTYPE_LSI32K — Внутренний источник тактирования 32КГц;


0 – сторожевой таймер;  
PCC_OSCILLATORTYPE_OSC32K — Внешний источник тактирования 32КГц;


1 – UART_0;  
PCC_OSCILLATORTYPE_ALL — Все источники тактирования
|-
| rowspan="3" |FreqMon
|OscillatorSystem
|PCC_OSCILLATORTYPE_HSI32M — Внутренний источник тактирования 32МГц;


2 – UART_1;  
PCC_OSCILLATORTYPE_OSC32M — Внешний источник тактирования 32МГц;  


3 – таймер16_0;  
PCC_OSCILLATORTYPE_LSI32K — Внутренний источник тактирования 32КГц;  


4 – таймер16_1;  
PCC_OSCILLATORTYPE_OSC32K — Внешний источник тактирования 32КГц
|-
|ForceOscSys
|PCC_FORCE_OSC_SYS_UNFIXED — Источник тактирования системы не выбирается принудительно;
PCC_FORCE_OSC_SYS_FIXED — Источник тактирования системы выбирается принудительно
|-
|Force32KClk


5 – таймер16_2;  
|PCC_FREQ_MONITOR_SOURCE_AUTO — Опорный источник частоты монитора частоты выбирается автоматически;


6 – таймер32_1;  
PCC_FREQ_MONITOR_SOURCE_LSI32K — Опорный источник частоты монитора частоты принудительно выбран как LSI32K;


7 – таймер32_2;  
PCC_FREQ_MONITOR_SOURCE_OSC32K — Опорный источник частоты монитора частоты принудительно выбран как OSC32K
|-
| colspan="2" | AHBDivider
|Минимальное значение: 0;
Максимальное значение: 255
|-
| colspan="2" | APBMDivider
|Минимальное значение:  0;


8 – SPI_0;  
Максимальное значение: 255
|-
| colspan="2" |APBPDivider
|Минимальное значение:  0;


9 – SPI_1;  
Максимальное значение: 255
|-
| colspan="2" |HSI32MCalibrationValue
|Минимальное значение:  0;


10 – I2C_0;  
Максимальное значение: 255
|-
| colspan="2" |LSI32KCalibrationValue
| Минимальное значение:  0;


11 – I2C_1;  
Максимальное значение: 255
|-
| colspan="2" |RTCClockSelection
|PCC_RTC_CLOCK_SOURCE_AUTO — Источник тактирования RTC выбирается  автоматически. Если присутствуют оба тактовых сигнала 32K, то выбирается  LSI32K;


12 – GPIO_0;  
PCC_RTC_CLOCK_SOURCE_LSI32K — Приоритетный источник тактирования RTC  - LSI32K;


13 – GPIO_1;
PCC_RTC_CLOCK_SOURCE_OSC32K — Приоритетный источник тактирования RTC - OSC32K
 
|-
14 – GPIO_2;
| colspan="2" |RTCClockCPUSelection
 
|PCC_CPU_RTC_CLOCK_SOURCE_OSC32K — Источник тактирования RTC в составе  ядра - OSC32K;
15 – регистры аналоговых блоков;  


16 – схема формирования прерываний GPIO
PCC_CPU_RTC_CLOCK_SOURCE_LSI32K — Источник тактирования RTC в составе ядра - LSI32K
|}
|}

Версия от 09:20, 6 ноября 2024

В основе работы любого микроконтроллера лежит процесс тактирования.

Тактирование — это процесс подачи тактовых импульсов генератором. Этот процесс необходим для синхронизации всех процессов в микроконтроллере.

Тактовая частота микроконтроллера — количество тактов, которые выполняет микроконтроллер в секунду. От частоты зависит эффективность микроконтроллера.

Чем больше тактовая частота микроконтроллера, тем большее количество операций он может выполнить за одну секунду. Она определяет порядок и скорость выполнения операций устройства.

Тактовые импульсы можно подавать двумя способами: через внутренний и внешний генератор.

Схема тактирования .jpg

Существует несколько типов тактовых резонаторов:

  1. RC-цепи
  2. Керамичсекие резонаторы
  3. Кварцевые резонаторы

Микроконтроллер MIK32 оснащен четырьмя генераторами, два на основе внешнего кварцевого резонатора и два на встроенном контуре RC.

  • Внешние генераторы
    • OSC32K — генератор с выводами для подключения внешнего часового кварцевого резонатора;
    • OSC32M — генератор с выводами для подключения внешнего кварцевого резонатора для тактирования системы с частотой от 1 до 32 МГц (генератор по-умолчанию);
  • Внутренние генераторы
    • HSI32M — встроенный генератор с частотой 32 МГц с возможностью корректировки частоты;
    • LSI32K — встроенных генератора с частотой 32 кГц с возможностью корректировки частоты;
  • монитор частоты, предназначен для контроля состояния источников тактирования во время работы микроконтроллера;

Управление тактированием

При включении питания и по внешнему сбросу:

  • тактирование осуществляется от внешнего осциллятора 32 МГц (OSC32M);
  • значения делителей шин AHB, APB_M, APB_P равны 0, то есть указанные шины работают на частоте осциллятора;
  • тактирование RAM, EEPROM, SPIFI, PowerManager, WakeUp включено, тактирование остальных устройств выключено;
  • тактирование сторожевого таймера осуществляется от встроенного осциллятора 32 МГц;
  • внешние осцилляторы OSC32K и OSC32M включены. Перед использованием внешнего осциллятора его необходимо включить записью «0» в поле OCS32M;

Для управления тактированием в микроконтроллере в сегрегированном файле main.c необходимо подключить библиотеку "mik32_hal_PCC.h" и создать функцию SystemClock_Config с вызовом ее в main.

Значение параметра OscillatorEnable отвечает за активацию источников тактирования в микроконтроллере.

FreqMon.OscillatorSystem выбирает основной источник тактирования микроконтроллера.

FreqMon.ForceOscSys позволяет или запрещает автоматическое изменение основного источника тактирования при отсутствии сигнала на нём.

FreqMon.Force32KClk предназначен для назначения опорного источника тактирования монитора частоты.

AHBDivider, APBMDivider, APBPDivider задают делитель частоты шин AHB, APB_М и APB_P соответственно.

Частоты сигналов на шинах рассчитываются по следующим формулам:

FAHB = FИСТОЧНИКА / (AHBDivider + 1),

FAPB_М = FAHB / (APBMDivider + 1),

FAPB_P = FAHB / (APBPDivider + 1).

Для настройки встроенного осциллятора HSI32M используются поправочные коэффициенты с допустимым значением от 0 до 255.

Для настройки встроенного осциллятора LSI32K используются поправочные коэффициенты с допустимым значением от 0 до 255.

RTCClockSelection используется для назначения приоритетного источника тактирования модуля RTC.

RTCClockCPUSelection используется для назначения приоритетного источника тактирования RTC в составе ядра.

Описание полей модуля управления тактированием представлено в таблице 1.

Таблица 1. Поля управления модуля тактирования

Поле Значения
OscillatorEnable PCC_OSCILLATORTYPE_HSI32M — Внутренний источник тактирования 32МГц;

PCC_OSCILLATORTYPE_OSC32M — Внешний источник тактирования 32МГц;

PCC_OSCILLATORTYPE_LSI32K — Внутренний источник тактирования 32КГц;

PCC_OSCILLATORTYPE_OSC32K — Внешний источник тактирования 32КГц;

PCC_OSCILLATORTYPE_ALL — Все источники тактирования

FreqMon OscillatorSystem PCC_OSCILLATORTYPE_HSI32M — Внутренний источник тактирования 32МГц;

PCC_OSCILLATORTYPE_OSC32M — Внешний источник тактирования 32МГц;

PCC_OSCILLATORTYPE_LSI32K — Внутренний источник тактирования 32КГц;

PCC_OSCILLATORTYPE_OSC32K — Внешний источник тактирования 32КГц

ForceOscSys PCC_FORCE_OSC_SYS_UNFIXED — Источник тактирования системы не выбирается принудительно;

PCC_FORCE_OSC_SYS_FIXED — Источник тактирования системы выбирается принудительно

Force32KClk PCC_FREQ_MONITOR_SOURCE_AUTO — Опорный источник частоты монитора частоты выбирается автоматически;

PCC_FREQ_MONITOR_SOURCE_LSI32K — Опорный источник частоты монитора частоты принудительно выбран как LSI32K;

PCC_FREQ_MONITOR_SOURCE_OSC32K — Опорный источник частоты монитора частоты принудительно выбран как OSC32K

AHBDivider Минимальное значение: 0;

Максимальное значение: 255

APBMDivider Минимальное значение: 0;

Максимальное значение: 255

APBPDivider Минимальное значение: 0;

Максимальное значение: 255

HSI32MCalibrationValue Минимальное значение: 0;

Максимальное значение: 255

LSI32KCalibrationValue Минимальное значение: 0;

Максимальное значение: 255

RTCClockSelection PCC_RTC_CLOCK_SOURCE_AUTO — Источник тактирования RTC выбирается автоматически. Если присутствуют оба тактовых сигнала 32K, то выбирается LSI32K;

PCC_RTC_CLOCK_SOURCE_LSI32K — Приоритетный источник тактирования RTC - LSI32K;

PCC_RTC_CLOCK_SOURCE_OSC32K — Приоритетный источник тактирования RTC - OSC32K

RTCClockCPUSelection PCC_CPU_RTC_CLOCK_SOURCE_OSC32K — Источник тактирования RTC в составе ядра - OSC32K;

PCC_CPU_RTC_CLOCK_SOURCE_LSI32K — Источник тактирования RTC в составе ядра - LSI32K