
你好
使用stm32微控制器从各种家用遥控器读取,解码和随后发送红外信号的库的说明。 基于用于arduino的IRremote
库 ,并适用于stm32。
该库使用一个计时器来接收和发送信号。 接收器连接到任何引脚(GPIO_Input),发送器连接到以PWM生成(PWM)模式工作的定时器的一个通道。 在该示例中,使用了定时器4的第一个通道-PB6(发送器)和PB5引脚(接收器)。
为了接收信号,定时器在中断模式下工作-每隔50μs就会检查输入引脚的状态,并且在发送期间它将切换到PWM生成模式,发送信号,然后切换回中断模式。
设置在文件IRremote.h中
extern TIM_HandleTypeDef htim4;
如果要配置另一个计时器,则需要指定相应的结构名称-htim4,并在IRremote.和irSend.文件中执行相同的操作。 我懒得定义所有这种经济。 在古巴选择其他计时器时,您只需要指定通道和内部时钟源即可...

该程序将配置其他所有内容。 如果选择其他通道号,则还需要在irSend.s文件中对其进行重命名。
对于其余的设置,我认为一切都很清楚-根据系统频率(在72 MHz的示例中),每50μs替换一次预分频器和溢出值。 以下内容显示了引脚的频率和读数。
以下是定义所涉及协议的定义...
禁用不必要的协议会减少程序的大小。 原则上,通常可以切掉未使用的协议和相应文件的功能(文件具有特征名称)。
该程序非常简单,my_decode(&results)函数解码接收到的信号并显示按钮代码,协议类型和数据包长度...

我没有其他遥控器。
要发送解码信号,请使用具有相应名称的功能...
sendSAMSUNG(0x707048b7, 32); my_enableIRIn();
my_enableIRIn()函数是必需的,它禁用PWM并将定时器置于接收模式。 相同的函数用于初始化(无限循环之前)。 由于此功能,您将无法捕获自己的信号-可以解决,但我认为没有意义。
如果您无法确定协议类型...

...然后没有什么可担心的,无论如何都会收到按钮代码。
如果您不仅需要接收未知信号,还需要发送未知信号,则需要取消注释“原始数据输出”的行...

...并使用sendRaw()函数发送读取的数据...
uint8_t khz = 38;
向我发送“原始”消息对我不起作用。
该库将DWT计数器用于微秒延迟。 据我所知,并不是所有的stm32都具有它,并且可能并非在所有地方都对其进行同样的配置。 如果您的石头没有DWT,则需要在irSend.s文件末尾的custom_delay_usec(未签名的长期使用)函数中提出一些要替换的内容,该设置位于开头。
仅此而已。
图书馆