0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32CUBEMX(5)--自定义红外NEC解码,定时器TIM捕获方式

嵌入式单片机MCU开发 来源:嵌入式单片机MCU开发 作者:嵌入式单片机MCU开 2022-11-14 15:48 次阅读

概述

本篇文章主要介绍如何使用STM32CubeMX对红外波形进行解码,并通过串口打印。

硬件准备

首先需要准备一个开发板,这里我准备的是NUCLEO-F030R8的开发板:

在这里插入图片描述

选择芯片型号

在这里插入图片描述

配置时钟

HSE与LSE分别为外部高速时钟和低速时钟,在本文中使用内置的时钟源,故都选择Disable选项,如下所示:在这里插入图片描述

配置时钟树

STM32F0的最高主频到48M,所以配置48即可:

在这里插入图片描述

串口配置

本次实验使用的串口1进行串口通信,波特率配置为115200。

在这里插入图片描述

在这里插入图片描述

定时器配置

本次使用定时器1的通道2进行检测,配置入下。

在这里插入图片描述

红外接收管

这里使用VS838的接收管,如下所示:

在这里插入图片描述

红外编码

NEC协议载波:38khz

其逻辑1与逻辑0的表示如图所示:

在这里插入图片描述

NEC协议格式:

在这里插入图片描述

自定义红外编码

协议如下:

在这里插入图片描述

代码

在main.c中,添加头文件,若不添加会出现 identifier "FILE" is undefined报错。

/* USER CODE BEGIN Includes */
#include "stdio.h"
/* USER CODE END Includes */

红外接收口定义

/* USER CODE BEGIN PTD */
#define IR_IN1 HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_9)
/* USER CODE END PTD */

函数声明和串口重定向:

/* USER CODE BEGIN PFP */
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
PUTCHAR_PROTOTYPE
{
    HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);
    return ch;
}
/* USER CODE END PFP */
/* USER CODE BEGIN 0 */
uint32_t OrderData = 0;
uint8_t ReadyFlag = 0;
uint8_t OK = 0;
/* USER CODE END 0 */

定时器配置

/* USER CODE BEGIN 2 */
    HAL_TIM_Base_Start_IT(&htim1);//启动定时器
    HAL_TIM_IC_Start_IT(&htim1,TIM_CHANNEL_2);//函数用于使能定时器某一通道的输入捕获功能,并使能相应的中断
    printf("IR Capture !! 
");
  /* USER CODE END 2 *

红外接收代码

  • [4400,5000]是用于捕获4.5ms的信号
  • [550,700]是用于捕获560us的数据0信号
  • [1100,1250]是用于捕获1120us的数据1信号
  • [2000,2500]是用于捕获2240us的截止位信号
/* USER CODE BEGIN 4 */
// 捕获中断回调函数,每次捕获到信号就会进入这个回调函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
    uint32_t fallingCount = 0 ; // 下降沿计数
    uint8_t temp = 0 ;
    // 判断是否是定时器1的外部捕获口2
    if(htim->Instance == TIM1)
    {
        // 捕获到了上升沿
        if(IR_IN1)
        {
            __HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_2, TIM_INPUTCHANNELPOLARITY_FALLING); // 改变捕获极性为下降沿捕获
            __HAL_TIM_SET_COUNTER(htim, 0); // 计数清零,从头开始计
        }
        else
        {
            fallingCount = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_2); // 读取捕获计数,这个时间即为上升沿持续的时间
            __HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_2, TIM_INPUTCHANNELPOLARITY_RISING); // 改变捕获极性为上升沿捕获
            if( ((fallingCount > 4400) && (fallingCount <5000))) 
                OK = 1;/// 4.5ms引导电平
            else if (((fallingCount > 550) && (fallingCount < 700)))    
            {
                temp = 0;//560 us,数据为0
            }   
            else if (((fallingCount > 1100) && (fallingCount < 1250)))
            {

                temp = 1;//1120 us,数据为1
            }

            else if (ReadyFlag==0&& ((fallingCount > 2000) && (fallingCount < 2500)))   //2.240ms截止码
            {
              ReadyFlag = 1 ;
                OK = 0;
            }
            if(OK)
            {
                OrderData <<= 1 ;
                OrderData += temp ;
                KeyCount = 0; // 按键次数
            }
        }
    }
}
/* USER CODE END 4 */

主函数

/* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
        if(ReadyFlag)
        {
            printf("order=%08X , code=%d
",OrderData,OrderData);
            OrderData = 0;
            OK = 0;
            ReadyFlag = 0;      
        }
  }
  /* USER CODE END 3 */

结果演示

红外连续发送5次码值,发送分别为

  • 1011(11)
  • 11 1010(58)
  • 11 0001(49)
  • 11 1111(63)
  • 11 0011(51)

分别如下所示:

在这里插入图片描述

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 定时器
    +关注

    关注

    23

    文章

    3246

    浏览量

    114694
  • 开发板
    +关注

    关注

    25

    文章

    5025

    浏览量

    97356
  • stm32cubemx
    +关注

    关注

    5

    文章

    283

    浏览量

    14788
收藏 人收藏

    评论

    相关推荐

    STM32CubeMx入门教程(3):定时器的使用

    导语“ 使用STM32CubeMx 生成初始化定时器代码,实现定时器特定定时
    发表于 07-11 15:22 4021次阅读
    <b class='flag-5'>STM32CubeMx</b>入门教程(3):<b class='flag-5'>定时器</b>的使用

    STM32CUBEMX(5)--自定义红外NEC解码定时器TIM捕获方式

    概述 本篇文章主要介绍如何使用STM32CubeMX红外波形进行解码,并通过串口打印。 硬件准备 首先需要准备一个开发板,这里我准备的是NUCLEO-F030R8的开发板: 教学视频 选择
    发表于 09-05 16:19

    如何使用STM32CubeMX红外波形进行解码并通过串口打印

    STM32CUBEME--自定义红外NEC解码定时器TIM
    发表于 08-10 06:52

    Stm32CubeMx基本定时器的概念

    Stm32CubeMx基本定时器基本定时器概念Stm32CubeMx 配置基本配置配置LED灯配置晶振时钟配置串口时钟数配置TIM6
    发表于 08-18 08:18

    STM32CubeMX基础定时器TIM6有何功能呢

    STM32CubeMX基础定时器TIM6的应用有哪些?STM32CubeMX基础定时器TIM6有
    发表于 11-24 07:31

    stm32 定时器 捕获

    输入捕获模式可以用来测量脉冲宽度或者测量频率。STM32定时器,除了TIM6和TIM7,其他定时器
    发表于 09-08 17:07 2374次阅读

    STM32CUBEMX配置教程(十二)STM32定时器触发的固定频率ADC采样(使用DMA)

    STM32CUBEMX配置教程(十二)STM32定时器触发的固定频率ADC采样(使用DMA)
    发表于 11-24 13:51 85次下载
    <b class='flag-5'>STM32CUBEMX</b>配置教程(十二)<b class='flag-5'>STM32</b>的<b class='flag-5'>定时器</b>触发的固定频率ADC采样(使用DMA)

    STM32CUBEMX配置教程(十三)STM32定时器触发的固定频率DAC输出(使用DMA)

    STM32CUBEMX配置教程(十三)STM32定时器触发的固定频率DAC输出(使用DMA)
    发表于 11-24 14:06 46次下载
    <b class='flag-5'>STM32CUBEMX</b>配置教程(十三)<b class='flag-5'>STM32</b>的<b class='flag-5'>定时器</b>触发的固定频率DAC输出(使用DMA)

    STM32CubeMX实战教程(五)——通用定时器(PWM输出)

    前言在上一章《STM32CubeMX实战教程(四)——基本定时器(还是点灯)》中,已经介绍过基本定时器的功能及用法,在这一章中,我讲主要介绍一下通用定时器的相关功能以及配置方法,废话不
    发表于 11-26 15:36 13次下载
    <b class='flag-5'>STM32CubeMX</b>实战教程(五)——通用<b class='flag-5'>定时器</b>(PWM输出)

    STM32CubeMX——定时器输入捕获

    通用定时器在基本定时器的基础上增加了一个外部引脚,可以实现输入捕获与输出比较等功能。高级定时器TIM1与
    发表于 12-02 14:06 9次下载
    <b class='flag-5'>STM32CubeMX</b>——<b class='flag-5'>定时器</b>输入<b class='flag-5'>捕获</b>

    STM32定时器TIM用作输入捕获

    定时器TIM2的通道3(PA2)为输入捕获。分频值根据自己需要设置,分频值越大采出的频率精度越低。周期最好拉满,这样采集时不会溢出。2.定时器TIM
    发表于 12-14 18:58 2次下载
    <b class='flag-5'>STM32</b>的<b class='flag-5'>定时器</b><b class='flag-5'>TIM</b>用作输入<b class='flag-5'>捕获</b>

    STM32CUBEMX(5)--自定义红外NEC解码定时器TIM捕获方式

    STM32CUBEME--自定义红外NEC解码定时器TIM
    发表于 12-17 17:45 8次下载
    <b class='flag-5'>STM32CUBEMX</b>(<b class='flag-5'>5</b>)--<b class='flag-5'>自定义</b><b class='flag-5'>红外</b><b class='flag-5'>NEC</b><b class='flag-5'>解码</b>,<b class='flag-5'>定时器</b><b class='flag-5'>TIM</b><b class='flag-5'>捕获</b><b class='flag-5'>方式</b>

    Arduino Nano上的自定义定时器功能

    电子发烧友网站提供《Arduino Nano上的自定义定时器功能.zip》资料免费下载
    发表于 10-26 14:26 0次下载
    Arduino Nano上的<b class='flag-5'>自定义</b><b class='flag-5'>定时器</b>功能

    STM32CUBEMX开发GD32F303(13)----定时器TIM捕获PWM测量频率与占空比

    概述 本章STM32CUBEMX配置STM32F103,并且在GD32F303中进行开发,同时通过开发板内进行验证。 本章STM32CUBEMX配置STM32F103输出PWM,同时使
    的头像 发表于 12-07 10:15 3508次阅读
    <b class='flag-5'>STM32CUBEMX</b>开发GD32F303(13)----<b class='flag-5'>定时器</b><b class='flag-5'>TIM</b><b class='flag-5'>捕获</b>PWM测量频率与占空比

    STM32 TIM—基本定时器

    STM32F4xx系列控制有共有14个TIM定时器。其中2个高级控制定时器TIM1和
    的头像 发表于 07-22 17:05 5013次阅读
    <b class='flag-5'>STM32</b> <b class='flag-5'>TIM</b>—基本<b class='flag-5'>定时器</b>