概述
本篇文章主要介紹如何使用STM32CubeMX對(duì)紅外波形進(jìn)行解碼,并通過(guò)串口打印。
硬件準(zhǔn)備
首先需要準(zhǔn)備一個(gè)開(kāi)發(fā)板,這里我準(zhǔn)備的是NUCLEO-F030R8的開(kāi)發(fā)板:
選擇芯片型號(hào)
配置時(shí)鐘源
HSE與LSE分別為外部高速時(shí)鐘和低速時(shí)鐘,在本文中使用內(nèi)置的時(shí)鐘源,故都選擇Disable選項(xiàng),如下所示:
配置時(shí)鐘樹(shù)
STM32F0的最高主頻到48M,所以配置48即可:
串口配置
本次實(shí)驗(yàn)使用的串口1進(jìn)行串口通信,波特率配置為115200。
在這里插入圖片描述
定時(shí)器配置
本次使用定時(shí)器1的通道2進(jìn)行檢測(cè),配置入下。
紅外接收管
這里使用VS838的接收管,如下所示:
紅外編碼
NEC協(xié)議載波:38khz
其邏輯1與邏輯0的表示如圖所示:
NEC協(xié)議格式:
自定義紅外編碼
協(xié)議如下:
代碼
在main.c中,添加頭文件,若不添加會(huì)出現(xiàn) identifier "FILE" is undefined報(bào)錯(cuò)。
/* 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 */
函數(shù)聲明和串口重定向:
/* 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 */
定時(shí)器配置
/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start_IT(&htim1);//啟動(dòng)定時(shí)器
HAL_TIM_IC_Start_IT(&htim1,TIM_CHANNEL_2);//函數(shù)用于使能定時(shí)器某一通道的輸入捕獲功能,并使能相應(yīng)的中斷
printf("IR Capture !!
");
/* USER CODE END 2 *
紅外接收代碼
- [4400,5000]是用于捕獲4.5ms的信號(hào)
- [550,700]是用于捕獲560us的數(shù)據(jù)0信號(hào)
- [1100,1250]是用于捕獲1120us的數(shù)據(jù)1信號(hào)
- [2000,2500]是用于捕獲2240us的截止位信號(hào)
/* USER CODE BEGIN 4 */
// 捕獲中斷回調(diào)函數(shù),每次捕獲到信號(hào)就會(huì)進(jìn)入這個(gè)回調(diào)函數(shù)
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
uint32_t fallingCount = 0 ; // 下降沿計(jì)數(shù)
uint8_t temp = 0 ;
// 判斷是否是定時(shí)器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); // 計(jì)數(shù)清零,從頭開(kāi)始計(jì)
}
else
{
fallingCount = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_2); // 讀取捕獲計(jì)數(shù),這個(gè)時(shí)間即為上升沿持續(xù)的時(shí)間
__HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_2, TIM_INPUTCHANNELPOLARITY_RISING); // 改變捕獲極性為上升沿捕獲
if( ((fallingCount > 4400) && (fallingCount <5000)))
OK = 1;/// 4.5ms引導(dǎo)電平
else if (((fallingCount > 550) && (fallingCount < 700)))
{
temp = 0;//560 us,數(shù)據(jù)為0
}
else if (((fallingCount > 1100) && (fallingCount < 1250)))
{
temp = 1;//1120 us,數(shù)據(jù)為1
}
else if (ReadyFlag==0&& ((fallingCount > 2000) && (fallingCount < 2500))) //2.240ms截止碼
{
ReadyFlag = 1 ;
OK = 0;
}
if(OK)
{
OrderData <<= 1 ;
OrderData += temp ;
KeyCount = 0; // 按鍵次數(shù)
}
}
}
}
/* USER CODE END 4 */
主函數(shù)
/* 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 */
結(jié)果演示
紅外連續(xù)發(fā)送5次碼值,發(fā)送分別為
- 1011(11)
- 11 1010(58)
- 11 0001(49)
- 11 1111(63)
- 11 0011(51)
分別如下所示:
審核編輯:湯梓紅
-
定時(shí)器
+關(guān)注
關(guān)注
23文章
3256瀏覽量
115450 -
開(kāi)發(fā)板
+關(guān)注
關(guān)注
25文章
5134瀏覽量
98334 -
stm32cubemx
+關(guān)注
關(guān)注
5文章
284瀏覽量
15052
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
STM32CubeMx入門(mén)教程(3):定時(shí)器的使用
![<b class='flag-5'>STM32CubeMx</b>入門(mén)教程(3):<b class='flag-5'>定時(shí)器</b>的使用](https://file1.elecfans.com/web2/M00/8C/7A/wKgZomStAsmAMp-WAAG9Qj5BIi8561.jpg)
STM32CUBEMX(5)--自定義紅外NEC解碼,定時(shí)器TIM捕獲方式
如何使用STM32CubeMX對(duì)紅外波形進(jìn)行解碼并通過(guò)串口打印
Stm32CubeMx基本定時(shí)器的概念
STM32CubeMX基礎(chǔ)定時(shí)器TIM6有何功能呢
stm32 定時(shí)器 捕獲
STM32CUBEMX配置教程(十二)STM32的定時(shí)器觸發(fā)的固定頻率ADC采樣(使用DMA)
![<b class='flag-5'>STM32CUBEMX</b>配置教程(十二)<b class='flag-5'>STM32</b>的<b class='flag-5'>定時(shí)器</b>觸發(fā)的固定頻率ADC采樣(使用DMA)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32CUBEMX配置教程(十三)STM32的定時(shí)器觸發(fā)的固定頻率DAC輸出(使用DMA)
![<b class='flag-5'>STM32CUBEMX</b>配置教程(十三)<b class='flag-5'>STM32</b>的<b class='flag-5'>定時(shí)器</b>觸發(fā)的固定頻率DAC輸出(使用DMA)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32CubeMX實(shí)戰(zhàn)教程(五)——通用定時(shí)器(PWM輸出)
![<b class='flag-5'>STM32CubeMX</b>實(shí)戰(zhàn)教程(五)——通用<b class='flag-5'>定時(shí)器</b>(PWM輸出)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32CubeMX——定時(shí)器輸入捕獲
![<b class='flag-5'>STM32CubeMX</b>——<b class='flag-5'>定時(shí)器</b>輸入<b class='flag-5'>捕獲</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32的定時(shí)器TIM用作輸入捕獲
![<b class='flag-5'>STM32</b>的<b class='flag-5'>定時(shí)器</b><b class='flag-5'>TIM</b>用作輸入<b class='flag-5'>捕獲</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32CUBEMX(5)--自定義紅外NEC解碼,定時(shí)器TIM捕獲方式
![<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'>定時(shí)器</b><b class='flag-5'>TIM</b><b class='flag-5'>捕獲</b><b class='flag-5'>方式</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
Arduino Nano上的自定義定時(shí)器功能
![Arduino Nano上的<b class='flag-5'>自定義</b><b class='flag-5'>定時(shí)器</b>功能](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32CUBEMX開(kāi)發(fā)GD32F303(13)----定時(shí)器TIM捕獲PWM測(cè)量頻率與占空比
![<b class='flag-5'>STM32CUBEMX</b>開(kāi)發(fā)GD32F303(13)----<b class='flag-5'>定時(shí)器</b><b class='flag-5'>TIM</b><b class='flag-5'>捕獲</b>PWM測(cè)量頻率與占空比](https://file.elecfans.com/web2/M00/7E/B7/poYBAGOG-mGAZl3hABOR8D6E0tU278.png)
評(píng)論