Введение
Контроллеры 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(); } }
Откомпилированный проект прикрепляю к уроку.
Прикрепленные файлы:
- STM8_2.rar (475 Кб)
Комментарии (5) | Я собрал (0) | Подписаться
Для добавления Вашей сборки необходима регистрация
[Автор]
Stm8s103
Надо на ногу вывести частоту деленую на два от частоты HSE
[Автор]