§
|
> Выбор альтернативной функции вывода "beeper", источника тактирования и его делителя |
Модуль звукового генератора микроконтроллеров STM8 предназначен для генерации на выводе "beeper" прямоугольных импульсов фиксированной звуковой частоты. Часть регистров, участвующих в работе модуля, расположены в области байтов
конфигурации flash-памяти микроконтроллера и требуют специализированной процедуры доступа. К ним относятся: - Бит разрешения альтернативной функции вывода "beeper”. При его установке соответствующий вывод
переключатся из состояния порта общего назначения в состояние выхода генератора.
- Бит выбора
источника тактирования модуля - CKAWUSEL,
определяющий в качестве генератора импульсов либо встроенный RC-генератор LSI с частотой 128кГц, либо основной системный генератор HSE с внешним
кварцевым резонатором;
CKAWUSEL = 0: значение по умолчанию, источник
тактирования для AWU и beeper – LSI;
CKAWUSEL = 1: источник тактирования для AWU и beeper – HSE.
PRSC[1:0] = 00: HSE 24
MHz -> 128 kHz; PRSC[1:0] = 01: HSE 16 MHz -> 128 kHz; PRSC[1:0] = 10:
HSE 8 MHz ->
128 kHz; PRSC[1:0] = 11:
HSE 4 MHz ->
128 kHz.
Процедура программного обращения к байтам
конфигурации STM8
предусматривает предварительную разблокировку этой области flash-памяти записью двух кодовых байт в
специализированный регистр разблокирования, а также записью в соседнюю для конфигурационного байта ячейку
побитно инвертированной копии его основного значения.
Для записи
указанных байтов могут быть использованы
библиотечные функции от STM: void FLASH_Unlock(FLASH_MemType_TypeDef MemType) void FLASH_ProgramOptionByte(u16 Address, u8 Data)
|
Первая из них, при
вызове с параметром FLASH_MEMTYPE_DATA, разблокирует область конфигурационных
регистров flash-памяти, вторая,
осуществляет запись значения Data
в конфигурационный байт с
адресом Address. Для
определения адресов байтов конфигурации "STM8S_Reference manual” рекомендует
сверяться с DataSheet на конкретный микроконтроллер. Значения битов CKAWUSEL и PRSC по умолчанию позволяют начать работу с тактированием
от встроенного генератора LSI 128кГц и единственное в чём остаётся потребность - разрешить альтернативную
функцию вывода установкой бита AFR7 конфигурационного
регистра OPT2: #include "stm8s.h" #include "stm8s_flash.h" #define OPT2 0x4803 // Адрес конфигурационного регистра OPT2.
#define AFR7 7 // Бит выбора альтернативной функции beeper в OPT2. FLASH_Unlock (FLASH_MEMTYPE_DATA); // Разблокировать область данных FLASH. FLASH_ProgramOptionByte(OPT2, 1<<AFR7); // Разрешить beep в регистре OPT2.
|
§
|
> Управление работой генератора |
Частота
звуковых сигналов определяется комбинацией битов пятиразрядного делителя входной частоты BEEPDIV регистра BEEP_CSR:
BEEPDIV[4:0]= 0: BEEPDIV = 2;
BEEPDIV[4:0]= 1: BEEPDIV = 3;
...
BEEPDIV[4:0]= 30: BEEPDIV = 32;
и трёхразрядного делителя BEEPSEL:
BEEPSEL[1:0] =00: fLS/(8 x BEEPDIV)
kHz output;
BEEPSEL[1:0] =01: fLS/(4 x BEEPDIV)
kHz output;
BEEPSEL[1:0] =1x: fLS/(2 x BEEPDIV)
kHz output;
Включение
и выключение сигнала осуществляется установкой и сбросом бита BEEPEN этого же регистра.
Программа последовательного воспроизведения звукового сигнала на 32 разных частотах:
#include "stm8s.h" #include "stm8s_flash.h" void main( void ) { CLK->ECKR|=CLK_ECKR_HSEEN; // Разрешаем работу генератора с внешним кварцем (HSEEN) CLK->SWCR|=CLK_SWCR_SWEN; // Разрешаем переключение генераторов CLK->SWR=0xB4; // Сlock от кварцевого генератора (HSE) while(CLK->CMSR!=0xB4); // Ждем стабилизации частоты CLK->CKDIVR=0; FLASH_Unlock(FLASH_MEMTYPE_DATA); // Разблокировать область данных FLASH. FLASH_ProgramOptionByte(0x4803, 1<<7); // Разрешить beep в регистре OPT2. BEEP->CSR=0; // Предочистка регистра beep. BEEP->CSR|=BEEP_CSR_BEEPEN; // Разрешить генератор. char FreqNum=30; // Значение делителя частоты. while(1) { for(long i=50000;i;i- -) asm("nop"); // Задержка. BEEP->CSR&=~BEEP_CSR_BEEPDIV; // Сброс битов делителя. BEEP->CSR|=FreqNum&BEEP_CSR_BEEPDIV; // Запись битов делителя. if (FreqNum) FreqNum- -; else FreqNum=30; // Декремент значения делителя. } }
Проект под IAR STM8 >> stm8beeper.rar |