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

Материал из MIK32 микроконтроллер
(Исправлены опечатки и ошибки переноса.)
(добавил название структуры)
 
(не показаны 4 промежуточные версии этого же участника)
Строка 1: Строка 1:


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


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


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


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


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


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


'''Схема тактирования'''
#RC-цепи
[[Файл:Схема тактирования .jpg|мини|894x894пкс]]
#Керамичсекие резонаторы
# Кварцевые резонаторы


Микроконтроллер 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.
{{#spoiler:show=Развернуть код|hide=Свернуть код|<syntaxhighlight lang="c" line="1">
#include "mik32_hal_pcc.h"


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


# RC-цепи
void main(){
# Керамичсекие резонаторы
    SystemClock_Config();
# Кварцевые резонаторы
    /* code */
}


Микроконтроллер MIK32 оснащен четырьмя генераторами, два на основе внешнего кварцевого резонатора и два на встроенном контуре RC.
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 отвечает за активацию источников тактирования в микроконтроллере.


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


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


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


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


Для выбора источников тактирования, задания делителей частоты, управлением HSI32M и OSC32M используются регистры модулей ''PowerManager'' и ''WakeUp''.
Частоты сигналов на шинах рассчитываются по следующим формулам:


Для управления тактированием часов реального времени и управлением LSI32K и OSC32K используются регистры модуля WakeUp.
FAHB = FИСТОЧНИКА / (AHBDivider + 1),


При включении питания и по внешнему сбросу:
FAPB_М = FAHB / (APBMDivider + 1),


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


Перед использованием внешнего осциллятора его необходимо включить запи- сью «0» в поле OCS32M_en регистра Generator блока WakeUp.  
Для настройки встроенного осциллятора HSI32M используются поправочные коэффициенты с допустимым значением от 0 до 255.


При необходимости, для снижения потребления встроенный осциллятор 32 MГц выключен путем записи «1» в поле RC32M_en регистра Generator блока PM.  
Для настройки встроенного осциллятора LSI32K используются поправочные коэффициенты с допустимым значением от 0 до 15.


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


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


Описание полей регистров модуля WU для управления тактированием пред- ставлено в таблице 1.
Для включения тактирования устройств на шинах AHB, APB_M и APB_P необходимо указать макрос с названием данной периферии. Все макросы приведены в таблице 2.


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


'''Таблица 1. Регистры и поля управления тактированием модуля WU'''
'''Таблица 1. Поля управления модуля тактирования ("mik32_hal_pcc.h")'''  


{| class="wikitable"
{| class="wikitable"
|+
|+
!Регистр
!Название структуры
!Смешение
! colspan="2" |Поле
!Обозначение
!Значения
!Номер разряда
!Описание
|-
|-
| rowspan="4" |CLOCKS_SYS
| rowspan="11" |PCC_InitTypeDef
| rowspan="4" |0х14
| colspan="2" |OscillatorEnable
|OSC32M_EN
|PCC_OSCILLATORTYPE_HSI32M — Внутренний источник тактирования 32МГц;
|[0]
 
|Включение/отключение внешнего осцилятора
PCC_OSCILLATORTYPE_OSC32M — Внешний источник тактирования 32МГц; 
0 – включение;  
 
1 – отключение
PCC_OSCILLATORTYPE_LSI32K — Внутренний источник тактирования 32КГц;
 
PCC_OSCILLATORTYPE_OSC32K — Внешний источник тактирования 32КГц;
 
PCC_OSCILLATORTYPE_ALL — Все источники тактирования
|-
| rowspan="3" |FreqMon
|OscillatorSystem
|PCC_OSCILLATORTYPE_HSI32M — Внутренний источник тактирования 32МГц;
 
PCC_OSCILLATORTYPE_OSC32M — Внешний источник тактирования 32МГц;
 
PCC_OSCILLATORTYPE_LSI32K — Внутренний источник тактирования 32КГц;  
 
PCC_OSCILLATORTYPE_OSC32K — Внешний источник тактирования 32КГц
|-
|-
|HSI32M_EN
|ForceOscSys
|[1]
|PCC_FORCE_OSC_SYS_UNFIXED — Источник тактирования системы не выбирается принудительно;
|Включение/отключение HSI32M
PCC_FORCE_OSC_SYS_FIXED — Источник тактирования системы выбирается принудительно
0 – включение;  
1 – отключение
|-
|-
|ADJ_HSI32M
|Force32KClk
|[9:2]
 
|Поправочные коэффициенты HSI32M
|PCC_FREQ_MONITOR_SOURCE_AUTO — Опорный источник частоты монитора частоты выбирается автоматически;
 
PCC_FREQ_MONITOR_SOURCE_LSI32K — Опорный источник частоты монитора частоты принудительно выбран как LSI32K;
 
PCC_FREQ_MONITOR_SOURCE_OSC32K — Опорный источник частоты монитора частоты принудительно выбран как OSC32K
|-
|-
|FORCE_32K_CLK
| colspan="2" |AHBDivider
|[11:10]
|Минимальное значение: 0;
|Принудительное переклю- чение на опорный источник для монитора частоты
Максимальное значение: 255
2’b01 – принудительно выбран OSC32K
|-
2’b10 – принудительно выбран LSI32K
| colspan="2" | APBMDivider
|Минимальное значение:  0;
 
Максимальное значение: 255
|-
|-
| rowspan="5" |CLOCKS_BU
| colspan="2" |APBPDivider
| rowspan="5" |0х10
|Минимальное значение:  0;
|OSC32K_EN
 
|[0]
Максимальное значение: 255
|Включение/отключение внешнего осцилятора на 32 KГц
0 – включение;
1 – отключение
|-
|-
|LSI32K_EN
| colspan="2" |HSI32MCalibrationValue
|[1]
|Минимальное значение:  0;
|Включение/отключение LSI32К
 
0 – включение;  
Максимальное значение: 255
1 – отключение
|-
|-
|ADJ_LSI32K
| colspan="2" |LSI32KCalibrationValue
|[9:6]
|Минимальное значение: 0;
|Поправочные коэффициенты LSI32К
 
Максимальное значение: 15
|-
|-
|RTC_CLK_MUX
| colspan="2" |RTCClockSelection
|[11:10]
|PCC_RTC_CLOCK_SOURCE_AUTO — Источник тактирования RTC выбирается  автоматически. Если присутствуют оба тактовых сигнала 32K, то выбирается  LSI32K;
|Выбор источника тактирования часов реального времени:
 
0x1 – внутренний LSI32К;  
PCC_RTC_CLOCK_SOURCE_LSI32K — Приоритетный источник тактирования RTC  - LSI32K;
1x2 – внешний осциллятор OSC32K
 
PCC_RTC_CLOCK_SOURCE_OSC32K — Приоритетный источник тактирования RTC - OSC32K
|-
|-
|OSC32K_SM
| colspan="2" |RTCClockCPUSelection
|[14]
|PCC_CPU_RTC_CLOCK_SOURCE_OSC32K — Источник тактирования RTC в составе  ядра - OSC32K;
|Режим повышенного потребления, активный уровень “0” для OSC32K
 
PCC_CPU_RTC_CLOCK_SOURCE_LSI32K — Источник тактирования RTC в составе ядра - LSI32K
|}
|}
'''Таблица 2. Регистры управления тактированием модуля PM'''
'''Таблица 2. Макросы для включения тактирования периферийных устройств ("mik32_hal_pcc.h")'''
{| class="wikitable"
{| class="wikitable"
|+
|+
!Регистр
!название макроса
!Смешение
!назначение макроса
!Обозначение
|-
!Номер разряда
| colspan="2" |'''Шина AHB'''
!Описание
|-
|__HAL_PCC_CPU_CLK_ENABLE()
__HAL_PCC_CPU_CLK_DISABLE()
|Включить/выключить  тактирование CPU
|-
|__HAL_PCC_EEPROM_CLK_ENABLE()
__HAL_PCC_EEPROM_CLK_DISABLE()
|Включить/выключить  тактирование EEPROM
|-
|__HAL_PCC_RAM_CLK_ENABLE()
__HAL_PCC_RAM_CLK_DISABLE()
|Включить/выключить  тактирование RAM
|-
|__HAL_PCC_SPIFI_CLK_ENABLE() 
__HAL_PCC_SPIFI_CLK_DISABLE()  
|Включить/выключить  тактирование SPIFI
|-
|__HAL_PCC_TCB_CLK_ENABLE()     
__HAL_PCC_TCB_CLK_DISABLE()   
|Включить/выключить  тактирование TCB
|-
|__HAL_PCC_DMA_CLK_ENABLE() 
__HAL_PCC_DMA_CLK_DISABLE()       
|Включить/выключить  тактирование DMA
|-
|__HAL_PCC_CRYPTO_CLK_ENABLE()  
__HAL_PCC_CRYPTO_CLK_DISABLE()
|Включить/выключить  тактирование CRYPTO
|-
|__HAL_PCC_CRC32_CLK_ENABLE()   
__HAL_PCC_CRC32_CLK_DISABLE()
|Включить/выключить  тактирование CRC32
|-
| colspan="2" |'''Шина APB_М'''
|-
|__HAL_PCC_PM_CLK_ENABLE()   
__HAL_PCC_PM_CLK_DISABLE()                     
|Включить/выключить  тактирование Power manager
|-
|__HAL_PCC_EPIC_CLK_ENABLE()   
__HAL_PCC_EPIC_CLK_DISABLE()                  
|Включить/выключить  тактирование контроллера прерываний
|-
|__HAL_PCC_TIMER32_0_CLK_ENABLE() 
__HAL_PCC_TIMER32_0_CLK_DISABLE()         
|Включить/выключить  тактирование TIMER32_0
|-
|__HAL_PCC_PAD_CONFIG_CLK_ENABLE()   
__HAL_PCC_PAD_CONFIG_CLK_DISABLE()      
|Включить/выключить  тактирование контроллера выводов
|-
|__HAL_PCC_WDT_BUS_CLK_ENABLE()       
__HAL_PCC_WDT_BUS_CLK_DISABLE()       
|Включить/выключить  тактирование сторожевого таймера шины
|-
|__HAL_PCC_OTP_CONTROLLER_CLK_ENABLE()
__HAL_PCC_OTP_CONTROLLER_CLK_DISABLE()
|Включить/выключить  тактирование OTP
|-
|__HAL_PCC_PVD_CONTROL_CLK_ENABLE()   
__HAL_PCC_PVD_CONTROL_CLK_DISABLE()   
|Включить/выключить  тактирование монитора напряжения
|-
|__HAL_PCC_WU_CLK_ENABLE()   
__HAL_PCC_WU_CLK_DISABLE()                      
|Включить/выключить  тактирование Wake up
|-
|__HAL_PCC_RTC_CLK_ENABLE()           
__HAL_PCC_RTC_CLK_DISABLE()           
|Включить/выключить  тактирование RTC
|-
|-
|DIV_AHB
| colspan="2" |'''Шина APB_P'''
|0x00
|DIV_AHB
|[7:0]
|Делитель частоты AHB
|-
|-
|DIV_APB_M
|__HAL_PCC_WDT_CLK_ENABLE()   
|0x04
__HAL_PCC_WDT_CLK_DISABLE()              
|DIV_APB_M
|Включить/выключить  тактирование сторожевого таймера
|[7:0]
|Делитель частоты APB_M
|-
|-
|DIV_APB_P
|__HAL_PCC_UART_0_CLK_ENABLE()     
|0x08
__HAL_PCC_UART_0_CLK_DISABLE()     
|DIV_APB_P
|Включить/выключить  тактирование UART_0
|[7:0]
|Делитель частоты APB_P
|-
|-
| rowspan="2" |AHB_MUX
|__HAL_PCC_UART_1_CLK_ENABLE()     
| rowspan="2" |0x24
__HAL_PCC_UART_1_CLK_DISABLE()     
|AHB_CLK_MUX
|Включить/выключить  тактирование UART_1
|[1:0]
|Выбор источника тактирования системы:
0 – внешний OSC32M;
1 – внутренний OSC32M;
2 – внешний OSC32K;
3 – внутренний OSC32К
|-
|-
|FORCE_MUX
|__HAL_PCC_TIMER16_0_CLK_ENABLE()   
|[3]
__HAL_PCC_TIMER16_0_CLK_DISABLE()  
|Запрет на принудительное переключение с выбранеого источника тактирования при пропадании тактирования
|Включить/выключить  тактирование Timer16_0
|-
|-
|WDT_CLK_MUX
|__HAL_PCC_TIMER16_1_CLK_ENABLE()   
|0x28
__HAL_PCC_TIMER16_1_CLK_DISABLE()  
|WDT_CLK_MUX
|Включить/выключить  тактирование Timer16_1
|[1:0]
|Выбор источника тактирования сторожевого таймера:
0 – внешний OSC32M;
1 – внутренний HSI32M;
2 – внешний OSC32K;
3 – внутренний LSI32К;
|-
|-
|CLK_AHB_SET
|__HAL_PCC_TIMER16_2_CLK_ENABLE()   
CLK_AHB_CLEAR
__HAL_PCC_TIMER16_2_CLK_DISABLE()  
|0x0C
|Включить/выключить  тактирование Timer16_2
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
|__HAL_PCC_TIMER32_1_CLK_ENABLE()   
CLK_APB_M_CLEAR
__HAL_PCC_TIMER32_1_CLK_DISABLE()  
|0x14
|Включить/выключить  тактирование Timer32_1
0x18
|-
|CLK_APB_M_SET
|__HAL_PCC_TIMER32_2_CLK_ENABLE()   
CLK_APB_M_CLEAR
__HAL_PCC_TIMER32_2_CLK_DISABLE()  
|[8:0]
|Включить/выключить  тактирование Timer32_2
|Управление тактированием устройств на шине APB_M.
|-
Запись «1» в Clk_ APBm_Set включает тактирование, запись «1» в CLK_APB_M_CLEAR отключает тактирование.
|__HAL_PCC_SPI_0_CLK_ENABLE()     
 
__HAL_PCC_SPI_0_CLK_DISABLE()        
Каждому биту соответствует одно устройство:
|Включить/выключить  тактирование SPI_0
 
|-
0 – Блок управления питанием (PM - Power Monitor);
|__HAL_PCC_SPI_1_CLK_ENABLE()       
 
__HAL_PCC_SPI_1_CLK_DISABLE()     
1 – контроллер прерываний;
|Включить/выключить  тактирование SPI_1
 
|-
2 – таймер32_0;
|__HAL_PCC_I2C_0_CLK_ENABLE()   
 
__HAL_PCC_I2C_0_CLK_DISABLE()          
3 – контроллер выводов;
|Включить/выключить  тактирование I2C_0
 
|-
4 – Сторожевой таймер шины
|__HAL_PCC_I2C_1_CLK_ENABLE()     
 
__HAL_PCC_I2C_1_CLK_DISABLE()       
5 – OTP;
|Включить/выключить  тактирование I2C_1
 
|-
6 – монитор питания системного домена
|__HAL_PCC_GPIO_1_CLK_ENABLE()   
 
__HAL_PCC_GPIO_1_CLK_DISABLE()     
7 – блок WU батарейного домена
|Включить/выключить  тактирование GPIO_0
 
|-
8 – RTC батарейного домена
|__HAL_PCC_GPIO_1_CLK_ENABLE()   
__HAL_PCC_GPIO_1_CLK_DISABLE()       
|Включить/выключить  тактирование GPIO_1
|-
|__HAL_PCC_GPIO_2_CLK_ENABLE()     
__HAL_PCC_GPIO_2_CLK_DISABLE()     
|Включить/выключить  тактирование GPIO_2
|-
|__HAL_PCC_ANALOG_REGS_CLK_ENABLE()
__HAL_PCC_ANALOG_REGS_CLK_DISABLE()
|Включить/выключить  тактирование аналоговых блоков
|-
|-
|CLK_APB_P_SET
|__HAL_PCC_GPIO_IRQ_CLK_ENABLE()   
CLK_APB_P_CLEAR
__HAL_PCC_GPIO_IRQ_CLK_DISABLE()   
|0x1C
|Включить/выключить  тактирование схемы формирования прерываний GPIO
0x20
|CLK_APB_P_SET
CLK_APB_P_CLEAR
|[16:0]
|Управление тактированием устройств на шине APB_P.
 
Запись «1» в Clk_ APBp_Set включает тактирование, запись «1» в CLK_APB_P_CLEAR отключает тактирование.
 
Каждому биту соответствует одно устройство:
 
0 – сторожевой таймер;
 
1 – UART_0;
 
2 – UART_1;
 
3 – таймер16_0;
 
4 – таймер16_1;
 
5 – таймер16_2;
 
6 – таймер32_1;
 
7 – таймер32_2;
 
8 – SPI_0;
 
9 – SPI_1;
 
10 – I2C_0;
 
11 – I2C_1;
 
12 – GPIO_0;
 
13 – GPIO_1;
 
14 – GPIO_2;
 
15 – регистры аналоговых блоков;
 
16 – схема формирования прерываний GPIO
|}
|}

Текущая версия от 12:00, 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 до 15.

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

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

Для включения тактирования устройств на шинах AHB, APB_M и APB_P необходимо указать макрос с названием данной периферии. Все макросы приведены в таблице 2.

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

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

Название структуры Поле Значения
PCC_InitTypeDef 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;

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

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

Таблица 2. Макросы для включения тактирования периферийных устройств ("mik32_hal_pcc.h")

название макроса назначение макроса
Шина AHB
__HAL_PCC_CPU_CLK_ENABLE()

__HAL_PCC_CPU_CLK_DISABLE()

Включить/выключить  тактирование CPU
__HAL_PCC_EEPROM_CLK_ENABLE()

__HAL_PCC_EEPROM_CLK_DISABLE()

Включить/выключить  тактирование EEPROM
__HAL_PCC_RAM_CLK_ENABLE()

__HAL_PCC_RAM_CLK_DISABLE()

Включить/выключить  тактирование RAM
__HAL_PCC_SPIFI_CLK_ENABLE() 

__HAL_PCC_SPIFI_CLK_DISABLE()  

Включить/выключить  тактирование SPIFI
__HAL_PCC_TCB_CLK_ENABLE()     

__HAL_PCC_TCB_CLK_DISABLE()   

Включить/выключить  тактирование TCB
__HAL_PCC_DMA_CLK_ENABLE() 

__HAL_PCC_DMA_CLK_DISABLE()       

Включить/выключить  тактирование DMA
__HAL_PCC_CRYPTO_CLK_ENABLE()  

__HAL_PCC_CRYPTO_CLK_DISABLE()

Включить/выключить  тактирование CRYPTO
__HAL_PCC_CRC32_CLK_ENABLE()   

__HAL_PCC_CRC32_CLK_DISABLE()

Включить/выключить  тактирование CRC32
Шина APB_М
__HAL_PCC_PM_CLK_ENABLE()   

__HAL_PCC_PM_CLK_DISABLE()                     

Включить/выключить  тактирование Power manager
__HAL_PCC_EPIC_CLK_ENABLE()   

__HAL_PCC_EPIC_CLK_DISABLE()                 

Включить/выключить  тактирование контроллера прерываний
__HAL_PCC_TIMER32_0_CLK_ENABLE() 

__HAL_PCC_TIMER32_0_CLK_DISABLE()         

Включить/выключить  тактирование TIMER32_0
__HAL_PCC_PAD_CONFIG_CLK_ENABLE()   

__HAL_PCC_PAD_CONFIG_CLK_DISABLE()     

Включить/выключить  тактирование контроллера выводов
__HAL_PCC_WDT_BUS_CLK_ENABLE()       

__HAL_PCC_WDT_BUS_CLK_DISABLE()       

Включить/выключить  тактирование сторожевого таймера шины
__HAL_PCC_OTP_CONTROLLER_CLK_ENABLE()

__HAL_PCC_OTP_CONTROLLER_CLK_DISABLE()

Включить/выключить  тактирование OTP
__HAL_PCC_PVD_CONTROL_CLK_ENABLE()   

__HAL_PCC_PVD_CONTROL_CLK_DISABLE()   

Включить/выключить  тактирование монитора напряжения
__HAL_PCC_WU_CLK_ENABLE()   

__HAL_PCC_WU_CLK_DISABLE()                     

Включить/выключить  тактирование Wake up
__HAL_PCC_RTC_CLK_ENABLE()           

__HAL_PCC_RTC_CLK_DISABLE()           

Включить/выключить  тактирование RTC
Шина APB_P
__HAL_PCC_WDT_CLK_ENABLE()   

__HAL_PCC_WDT_CLK_DISABLE()             

Включить/выключить  тактирование сторожевого таймера
__HAL_PCC_UART_0_CLK_ENABLE()     

__HAL_PCC_UART_0_CLK_DISABLE()     

Включить/выключить  тактирование UART_0
__HAL_PCC_UART_1_CLK_ENABLE()     

__HAL_PCC_UART_1_CLK_DISABLE()     

Включить/выключить  тактирование UART_1
__HAL_PCC_TIMER16_0_CLK_ENABLE()   

__HAL_PCC_TIMER16_0_CLK_DISABLE()  

Включить/выключить  тактирование Timer16_0
__HAL_PCC_TIMER16_1_CLK_ENABLE()   

__HAL_PCC_TIMER16_1_CLK_DISABLE()  

Включить/выключить  тактирование Timer16_1
__HAL_PCC_TIMER16_2_CLK_ENABLE()   

__HAL_PCC_TIMER16_2_CLK_DISABLE()  

Включить/выключить  тактирование Timer16_2
__HAL_PCC_TIMER32_1_CLK_ENABLE()   

__HAL_PCC_TIMER32_1_CLK_DISABLE()  

Включить/выключить  тактирование Timer32_1
__HAL_PCC_TIMER32_2_CLK_ENABLE()   

__HAL_PCC_TIMER32_2_CLK_DISABLE()  

Включить/выключить  тактирование Timer32_2
__HAL_PCC_SPI_0_CLK_ENABLE()     

__HAL_PCC_SPI_0_CLK_DISABLE()       

Включить/выключить  тактирование SPI_0
__HAL_PCC_SPI_1_CLK_ENABLE()       

__HAL_PCC_SPI_1_CLK_DISABLE()     

Включить/выключить  тактирование SPI_1
__HAL_PCC_I2C_0_CLK_ENABLE()   

__HAL_PCC_I2C_0_CLK_DISABLE()         

Включить/выключить  тактирование I2C_0
__HAL_PCC_I2C_1_CLK_ENABLE()     

__HAL_PCC_I2C_1_CLK_DISABLE()       

Включить/выключить  тактирование I2C_1
__HAL_PCC_GPIO_1_CLK_ENABLE()   

__HAL_PCC_GPIO_1_CLK_DISABLE()     

Включить/выключить  тактирование GPIO_0
__HAL_PCC_GPIO_1_CLK_ENABLE()   

__HAL_PCC_GPIO_1_CLK_DISABLE()       

Включить/выключить  тактирование GPIO_1
__HAL_PCC_GPIO_2_CLK_ENABLE()     

__HAL_PCC_GPIO_2_CLK_DISABLE()     

Включить/выключить  тактирование GPIO_2
__HAL_PCC_ANALOG_REGS_CLK_ENABLE()

__HAL_PCC_ANALOG_REGS_CLK_DISABLE()

Включить/выключить  тактирование аналоговых блоков
__HAL_PCC_GPIO_IRQ_CLK_ENABLE()   

__HAL_PCC_GPIO_IRQ_CLK_DISABLE()   

Включить/выключить  тактирование схемы формирования прерываний GPIO