STM8. Урок 2. Тактирование контроллера

Введение

Контроллеры STM8 имеют собственную систему тактирования периферии. Это сделано с целью повышения энергосбережения. Я считаю, главным отличием от STM32 является отсутствие в контроллере STM8 PPL (ФАПЧ), в контроллере присутствует лишь делитель тактового сигнала. Это позволяет программно понижать тактовую частоту работы ядра и периферии ниже частоты внутреннего или внешнего кварца, тем самым уменьшая энергопотребление. А когда необходимо что-то быстро рассчитать, можно снова поднять частоту ядра.

Хочу ещё раз подчеркнуть ядро и настройки в регистрах специально проектировались под язык программирования СИ. Язык Си был в начале спроектирован для CISC архитектуры процессора и организации памяти фон Неймана. В Справочном пособии (RM031) на первых страницах описывается именно такая организация процессора и памяти. Использование SPL библиотеки я считаю обязательным при программировании STM8. Настройка отдельных битов, регистров является приведет к многочисленным ошибкам. Кроме того, SPL библиотека позволяет организовать слой абстракции для быстрой и правильной настройки периферии.

Настройка контроллера должна начинаться с тактирования. С частотой тактирования связанна практически вся периферия, за исключением может быть лишь SPI интерфейса, DMA, ADC. Забыл сказать, чтобы включить любую периферию на нее надо в начале подать тактирование, иначе работать не будет. 

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

Я не буду приводить схему тактирования приведенную в RM031, я приведу свою интерпритационную схему тактирования для упрощения понимания настройки.В ней я не буду рассматривать тактирование некоторых дополнительных блоков ЖК-экран, часов реального времени, бипера, сторожевого таймера. На мой взгляд этого лишь запутает читателя. Если понять принцип, это в этих нюансах можно будет разобраться самостоятельно. Если будет нужно, может быть и сам потом напишу статью про них.

И так начнем. Существуют 4 источника тактового сигнала для тактирования ядра и периферии (почти всей).

  • Внутренний высокочастотный источник RC, 16 МГц
  • Внешний высокочастотный источник
  • Внутренний низкочастотный источник 38кГц
  • Внешний низкочастотный источник (обычно 32768 Гц)

Внешние источники могут иметь следующие настройки:

  • отключены 
  • работают от кварцевого резонатора
  • работают от внешнего сигнала

Внутренние источники могут быть лишь включены или отключены. По-умолчанию Внутренние источники включены. 

При загрузке МК тактирование ядра осуществляется от Внутреннего выскочастотного генератора, через предделитель на 8, таким образом ядро работает на 2МГц.

Для смены источника тактирования необходимо:

  • включить Необходимый режим работы внешнего источника (для внутреннего источника не требуется)
  • разрешить Смену источника тактирования
  • выбрать настроенный источник тактирования
  • запретить Смену источника тактирования (для безопасности)

Все. 3 функции, 4 вызова и все настроено. Для безопасности можно включить Модуль слежения за внешним тактовым сигналом. При пропадании внешнего сигнала с HSE МК автоматически переключиться на Внутренний HSI.

Выбор предделителя системного сигнала можно осуществлять в любое время.

Тактовый сигнал от любого генератора можно подавать на ножку CCO (PC4). При этом частоту можно делить, т.о. функция имеет два параметра: источник сигнала и делитель.

Любую периферию необходимо затактировать. Для этого функции необходимо  два параметра: название периферии и состояние тактирования (вкл/откл).

В библиотеке SPL ещё много функций. Я считаю, для ознакомления и пониманию работы этого достаточно.

Практическая часть

Задача. Настроить мигание светодиода от Внутреннего низкочастотного источника (LSI) с предделителем равным 1 (Sys=38kHz), и Внутреннего высокочастотного источника с предделителем равным 128 (125kHz). Через 10 миганий светодиода PC7 производить смену источника тактирования.

Создадим и настроим проект согласно уроку 1. Название проекта sysclk.

Подключим исходники файлов для управления тактированием и настройкой частоты:  

  • stm8l15x_clk.c
  • stm8l15x_gpio.c

Функции и структуру GPIO рассмотрим в следующем уроке.

/* Includes ——————————————————————*/
#include «stm8l15x.h»

/** @addtogroup STM8L15x_StdPeriph_Template
 * @{
*/

/* Private typedef ————————————————————*/
/* Private define ————————————————————*/
/* Private macro ————————————————————-*/
/* Private variables ———————————————————*/
/* Private function prototypes ————————————————*/

void delay_prog(void)
{
uint16_t i2;
for(i2=0; i2<0xFFF; i2++);
}
void toggle_led(void)
{
uint8_t i;
for(i=0; i<10; i++)
   {
   GPIO_ToggleBits(GPIOC, GPIO_Pin_7);
   delay_prog();
   }
}
/* Private functions ———————————————————*/

/**
 * @brief  Main program.
 * @param  None
 * @retval None
 */
   void main(void)
{
  GPIO_Init(GPIOC, GPIO_Pin_7, GPIO_Mode_Out_PP_High_Slow);   // настройка PC7 на режим пуш-пулл  //———————
/* Infinite loop */
while (1)
 {
   // Переключаем тактовый генератор на высокоскоростной источник
  CLK_SYSCLKSourceSwitchCmd(ENABLE); // разрешаем изменение тактирования
   CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_HSI); //Выбор источн. тактирования
   CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_128); // Предделитель
   CLK_SYSCLKSourceSwitchCmd(DISABLE); // Запрет изменения ист. тактиров   //————————————————————
   toggle_led(); // переключаем светодиод 10 раз
   //————————————————————
   // Переключаем тактовый генератор на низкоскоростной источник
   CLK_SYSCLKSourceSwitchCmd(ENABLE);
   CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_LSI);
   CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);
   CLK_SYSCLKSourceSwitchCmd(DISABLE);
   //————————————————————
   toggle_led();
   }
}

Откомпилированный проект прикрепляю к уроку.

Прикрепленные файлы:

Добавить комментарий

Ваш адрес email не будет опубликован.