学习STM32的红外遥控编码

#include <stdint.h> #include <stdbool.h> #include "stm32f10x.h"

void GPIO_init(void); void TIM_init(void); void EXTI_init(void); void NVIC_init(void); void delay_us(uint32_t us);

int main(void) { // 初始化外设 GPIO_init(); TIM_init(); EXTI_init(); NVIC_init();

while (1)
{
    // 程序主循环,等待中断
}

}

void GPIO_init(void) { // 使能GPIOB时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

// 配置GPIOB8为浮空输入
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);

}

void TIM_init(void) { // 使能TIM2时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

// 配置TIM2的时基
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Prescaler = 71;  // 设置预分频器为72-1
TIM_TimeBaseStructure.TIM_Period = 9999;  // 设置自动重载寄存器为10000-1
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

// 使能定时器2
TIM_Cmd(TIM2, ENABLE);

}

void EXTI_init(void) { // 使能GPIOB时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

// 配置GPIOB8为上拉输入
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);

// 映射外部中断线到GPIOB8
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource8);

// 配置外部中断线
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line = EXTI_Line8;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);

}

void NVIC_init(void) { // 配置NVIC中断优先级 NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); }

void EXTI9_5_IRQHandler(void) { if (EXTI_GetITStatus(EXTI_Line8) != RESET) { // 延时一段时间,等待红外信号稳定 delay_us(100);

    // 读取红外信号
    uint32_t code = 0;
    for (int i = 0; i &lt; 32; i++)
    {
        // 读取高电平的持续时间
        int high_duration = 0;
        while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_8))
        {
            delay_us(1);
            high_duration++;
        }

        // 读取低电平的持续时间
        int low_duration = 0;
        while (!GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_8))
        {
            delay_us(1);
            low_duration++;
        }

        // 根据高低电平的持续时间判断是“0”还是“1”
        if (high_duration > low_duration)
        {
            code |= (1 &lt;&lt; (31 - i));
        }
    }

    // 解码红外信号
    uint8_t address = (code >> 16) & 0xFF;
    uint8_t command = (code >> 8) & 0xFF;
    uint8_t inverse_command = code & 0xFF;

    // 响应红外遥控指令
    if (command == (~inverse_command & 0xFF))
    {
        switch (command)
        {
            case 0x00:
                // 执行指令0x00
                break;
            case 0x01:
                // 执行指令0x01
                break;
            // ...
            default:
                break;
        }
    }

    // 清除外部中断标志位
    EXTI_ClearITPendingBit(EXTI_Line8);
}

}

void delay_us(uint32_t us) { uint32_t start = TIM2->CNT; while (TIM2->CNT - start < us); }

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CrMylive.

穷呀,求求补助

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值