
Olá.
Descrição da biblioteca para leitura, decodificação e envio subsequente de sinais infravermelhos de vários controles remotos domésticos usando o microcontrolador stm32. Baseado na
biblioteca IRremote para arduino e adaptado para stm32.
A biblioteca usa um cronômetro, tanto para receber quanto para enviar um sinal. O receptor está conectado a qualquer pino (GPIO_Input) e o transmissor está conectado a um dos canais do timer trabalhando no modo de geração PWM (PWM). No exemplo, o primeiro canal do temporizador nº 4 é usado - PB6 (transmissor) e pino PB5 (receptor).
Para receber um sinal, o timer opera no modo de interrupção - a cada 50 μs, ele verifica o status do pino de entrada e, durante a transmissão, alterna para o modo de geração PWM, envia um sinal e volta ao modo de interrupção.
As configurações estão no arquivo IRremote.h
extern TIM_HandleTypeDef htim4;
Se você configurar outro cronômetro, precisará especificar o nome da estrutura correspondente - htim4 e fazer o mesmo nos arquivos IRremote. e irSend.. Eu estava com preguiça de definir toda essa economia. Ao escolher outro timer em Cuba, você precisa especificar apenas o canal e a fonte do relógio interno ...

O programa irá configurar tudo o resto. Se você selecionar um número de canal diferente, também precisará renomeá-lo no arquivo irSend.s.
Com o restante das configurações, acho que tudo está claro - com base na frequência do sistema (no exemplo de 72 MHz), os valores do pré-divisor e do transbordamento substituem a interrupção a cada 50 μs. A seguir, indica a frequência e a leitura do pino.
Abaixo estão as definições que definem os protocolos envolvidos ...
Desativar protocolos desnecessários reduz o tamanho do programa. Em princípio, você geralmente pode cortar as funções de protocolos não utilizados e os arquivos correspondentes (os arquivos têm nomes de características).
O programa é extremamente simples, a função my_decode (& results) decodifica o sinal recebido e exibe o código do botão, tipo de protocolo e tamanho do pacote ...

Não tenho outros controles remotos.
Para enviar o sinal decodificado, use a função com o nome correspondente ...
sendSAMSUNG(0x707048b7, 32); my_enableIRIn();
A função my_enableIRIn () é necessária, desativa o PWM e coloca o timer no modo de recebimento. A mesma função é usada para inicialização (antes de um loop infinito). Devido a essa função, você não poderá captar seu próprio sinal - isso pode ser resolvido, mas não vejo sentido nisso.
Se você não pode determinar o tipo de protocolo ...

... então não há nada com que se preocupar, o código do botão é recebido de qualquer maneira.
Se você precisar não apenas receber um sinal desconhecido, mas também enviá-lo, será necessário descomentar as linhas de "saída de dados brutos" ...

... e envie os dados lidos usando a função sendRaw () ...
uint8_t khz = 38;
Enviar-me "bruto" não funciona para mim.
A biblioteca usa um contador DWT para atrasos de microssegundos. Até onde eu sei, nem todos os stm32 o possuem, e é possível que nem todos os lugares estejam igualmente configurados. Se a sua pedra não possui DWT, é necessário criar algo para substituir na função custom_delay_usec (não assinada há muito tempo) no final do arquivo irSend.s, a configuração está no início.
Isso é tudo.
A biblioteca