概述
本篇文章主要介绍如何使用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文章
3236浏览量
114413 -
开发板
+关注
关注
25文章
4926浏览量
97137 -
stm32cubemx
+关注
关注
5文章
280浏览量
14739
发布评论请先 登录
相关推荐
STM32CUBEMX(5)--自定义红外NEC解码,定时器TIM捕获方式
概述
本篇文章主要介绍如何使用STM32CubeMX对红外波形进行解码,并通过串口打印。
硬件准备
首先需要准备一个开发板,这里我准备的是NUCLEO-F030R8的开发板:
教学视频
选择
发表于 09-05 16:19
Stm32CubeMx基本定时器的概念
Stm32CubeMx基本定时器基本定时器概念Stm32CubeMx 配置基本配置配置LED灯配置晶振时钟配置串口时钟数配置TIM6
发表于 08-18 08:18
STM32CUBEMX配置教程(十二)STM32的定时器触发的固定频率ADC采样(使用DMA)
STM32CUBEMX配置教程(十二)STM32的定时器触发的固定频率ADC采样(使用DMA)
发表于 11-24 13:51
•85次下载
STM32CUBEMX配置教程(十三)STM32的定时器触发的固定频率DAC输出(使用DMA)
STM32CUBEMX配置教程(十三)STM32的定时器触发的固定频率DAC输出(使用DMA)
发表于 11-24 14:06
•46次下载
STM32CubeMX实战教程(五)——通用定时器(PWM输出)
前言在上一章《STM32CubeMX实战教程(四)——基本定时器(还是点灯)》中,已经介绍过基本定时器的功能及用法,在这一章中,我讲主要介绍一下通用定时器的相关功能以及配置方法,废话不
发表于 11-26 15:36
•13次下载
STM32的定时器TIM用作输入捕获
定时器TIM2的通道3(PA2)为输入捕获。分频值根据自己需要设置,分频值越大采出的频率精度越低。周期最好拉满,这样采集时不会溢出。2.定时器TIM
发表于 12-14 18:58
•2次下载
STM32CUBEMX开发GD32F303(13)----定时器TIM捕获PWM测量频率与占空比
概述 本章STM32CUBEMX配置STM32F103,并且在GD32F303中进行开发,同时通过开发板内进行验证。 本章STM32CUBEMX配置STM32F103输出PWM,同时使
评论