Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // ***********************************************************
- // test2.c
- //
- // ***********************************************************
- #include "test2.h"
- #include "../drivers.h"
- #include "../bsp.h"
- uint16_t Gamma[] = {
- 262, // до
- // 277, // до#
- 294, // ре
- // 311, // ре#
- 330, // ми
- 349, // фа
- // 370, // фа#
- 392, // соль
- // 415, // соль#
- 440, // ля
- // 466, // ля#
- 494, // си
- 523 // до
- };
- const uint16_t Prescaler = 20;
- uint16_t Frequency = 0;
- bool On = false; // состояние левого канала
- bool Ch = true; // текущий канал, первый - левый
- static void test2_ChangeFrequency(void)
- {
- static bool Dir = true; // Направление
- static uint16_t Counter = Prescaler;
- // Изменение частоты каждые Prescaler+1 вызовов
- if(Counter)
- {
- // предделитель
- Counter--;
- return;
- }
- else
- {
- Counter = Prescaler;
- }
- if(Dir)
- {
- Frequency++;
- if(Frequency >= ((sizeof(Gamma) / sizeof(Gamma[0])) - 1))
- {
- Dir = false;
- }
- }
- else
- {
- Frequency--;
- if(Frequency == 0)
- {
- Dir = true;
- }
- }
- }
- // Инициализация процесса
- void test2_Init(void)
- {
- // Таймер, смена частоты звука
- timer_AddFunction(10, &test2_ChangeFrequency);
- // Включение внешнего ЦАП и его драйвера
- cs43l22_AudioOn();
- // Звук: 43%
- cs43l22_SetVolume(0x70);
- }
- // Левый канал - молчит
- static void test2_SendLeft(void)
- {
- i2s_Send(0x0000);
- }
- // Правый канал - пищит
- static void test2_SendRight(void)
- {
- i2s_Send((On) ? 0x7fff : 0x8000);
- }
- // Пора отправлять следующий семпл
- static void test2_NextSample(void)
- {
- static uint16_t Delay = 0;
- // Сменим состояние, если полупериод закончился
- if(!Delay)
- {
- // Частоту берм из таблицы высот
- Delay = 48000UL / Gamma[Frequency] / 2;
- On = !On;
- }
- else
- {
- Delay--;
- }
- // Меандр
- // Семплы шлются по очереди двум каналам
- if(Ch)
- {
- test2_SendLeft();
- }
- else
- {
- test2_SendRight();
- }
- Ch = !Ch;
- }
- // Отправка очередного семпла (по необходимости)
- void test2_Main(void)
- {
- // Если буфер пуст, следующий семпл отправим
- if(i2s_IsBufferFree()) test2_NextSample();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement