Нет, все переискал...у меня мало опыта работы с контроллерами. Думаю срабатывает прерывание и происходит рассогласование по передаче. Могу предоставить исходный код.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Думаю срабатывает прерывание и происходит рассогласование по передаче.
Вряд ли. Сработавшее прерывание таймера позволит лишь ошибиться на одну единицу времени, а это совсем не критично. Впрочем, лучше действительно приведите код проекта - вдруг ошибка легко обнаружится.
После перерыва наконец то заработал мой плеер. Вот видео работы
Программа пока очень сырая. Сделал буферизацию на влезло пока 65535 байт Хочу сделать кусочками хотя бы по 1 Кб или пока напрямую читать по байту с карты.
У меня вопрос как организовать пользовательский интерфейс, т.е. сделать отображение текущего блока и полоску оставшегося времени воспроизведения.
Добавлено after 2 minutes 21 second:
Код:
void TIM7_IRQHandler(void) { /* USER CODE BEGIN TIM7_IRQn 0 */
/* USER CODE END TIM7_IRQn 0 */ HAL_TIM_IRQHandler(&htim7); /* USER CODE BEGIN TIM7_IRQn 1 */ if (TapeOutMode==TAPE_OUT_STOP) { index16=16;//первоначальное значение бита byte =0;//первоначальное значение байта HAL_GPIO_WritePin(T_OUT_GPIO_Port, T_OUT_Pin, GPIO_PIN_RESET); return; } if (TapeOutVolume==true) { HAL_GPIO_WritePin(T_OUT_GPIO_Port, T_OUT_Pin, GPIO_PIN_RESET); TapeOutVolume=false; } else { HAL_GPIO_WritePin(T_OUT_GPIO_Port, T_OUT_Pin, GPIO_PIN_SET); TapeOutVolume=true; }
//выводим пилот-тон if (TapeOutMode==TAPE_OUT_LEAD) { TIM7->ARR = 2168*2;//начальное значение таймера if (tim6_countersec > 0) tim6_countersec--; else { tim6_countersec = 3223;//Время воспроизведения пилот тона 2 сек. TapeOutMode=TAPE_OUT_SYNCHRO_1; return; } }
//выводим синхросигнал 1 if (TapeOutMode==TAPE_OUT_SYNCHRO_1) { TIM7->ARR = 667;//начальное значение таймера TapeOutMode=TAPE_OUT_SYNCHRO_2; return; }
//выводим синхросигнал 2 if (TapeOutMode==TAPE_OUT_SYNCHRO_2){ TIM7->ARR = 735;//начальное значение таймера TapeOutMode=TAPE_OUT_DATA; index16=16; byte=0; BytesCount=0;//обнуляем счетчик байт return;}
//передаём данные if (TapeOutMode==TAPE_OUT_DATA) { if (index16>=16) { if (BytesCount>=sz) { TapeOutMode=TAPE_OUT_STOP; //TapeOutMode=TAPE_OUT_PAUSE;//ставим паузу по оканчанию процесса //sz=FioNextHead();//читаем размер блока BytesCount = 0; return; } //byte=FioNextByte();//читаем байт из буфера byte=read_byte();//читаем байт из буфера index16=0;//первоначальное значение бита BytesCount++;//общий счетчик байт файла byte_temp = byte; } // printf("byte_temp %X\r\n", byte_temp); //выдаём бит if (byte&128) { TIM7->ARR = 1710*2;//начальное значение таймера //printf("bit%u =1 byte %u\r\n", index16,BytesCount); } else { TIM7->ARR = 855*2;//начальное значение таймера //printf("bit%u =0 byte %u\r\n", index16,BytesCount); } if ((index16%2)==1) byte<<=1; index16++; return; } /* USER CODE END TIM7_IRQn 1 */ }
Зависит от типа памяти (по SPi, I2C, параллельная). И, насколько я читал (но не точно), у STM бывает программные интерфейс для работы с некоторыми типами памяти.
Да, неверно задавал регистры. Сейчас использую все настройки через ARR Основной стоит делитель PSC 120 (тактовая 84МГц) До этого делал ARR=1 и частоту настраивал через PSC
Так же настроил уровень сигнала, слишком большой искажал форму. Это все в рамках эмулятора на ПК.
Добавлено after 1 minute: Думаю как паузу организовать и прокрутку блоков так как некоторые игры требуют остановки воспроизведения, либо выбор уровней.
da-nie, а что стряслось в тестом памяти в версии прошивки Firmware 2.2? Длится аж 15 минут.
Реально отсортировать файлы хотя бы по имени?
P.S. Вставляю пустую SD карту. Появляется Основное меню в котором выбираю пункт Магнитофон х1. Появляется сообщение "Нет файлов tap" и через пару секунд опять попадаю в Основное меню. На горячую меняю карту и ... все, более на кнопки магнитофон не реагирует. Так и должно быть или задумывалось, что сменим карту и будем работать дальше?
Запустил полностью свою версию плеера. Сделал перемотку вперед и назад, паузу и выход. Теперь все нужно тестировать на глюки. Хочу попробовать чтение tzx и запись реализовать.
Тест памяти был изменён - проверяется каждое значение байта (0-255). Просто кто-то жаловался на плавающие дефекты и сделал так.
Горячая замена карты не поддерживается.
tzx довольно сложный формат. И в общем, не нужный. А запись сделать можно (но потребуется игра с FAT). Я их не делал из-за общей бесполезности такого. Не припомню необходимости сохранять что-либо с ZX сейчас, за исключением файлов достижений от Elite. Но они мне не нужны.
Сейчас этот форум просматривают: HeadLess и гости: 19
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения