Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Вряд ли. Сработавшее прерывание таймера позволит лишь ошибиться на одну единицу времени, а это совсем не критично.Думаю срабатывает прерывание и происходит рассогласование по передаче.
Код: Выделить всё
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 */
}