你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32CUBEME--自定义红外NEC解码,定时器TIM捕获方式

[复制链接]
STMCU-管管 发布时间:2020-12-2 13:01
STM32CUBEME--自定义红外NEC解码,定时器TIM捕获方式
概述
   本篇文章主要介绍如何使用STM32CubeMX对红外波形进行解码,并通过串口打印。. h& C, _# y! _  t+ q9 @
/ g. Z. @! V5 `* w; a; J" c

3 T8 v7 z* O+ {1 j$ G
硬件准备
    首先需要准备一个开发板,这里我准备的是NUCLEO-F030R8的开发板:   
& }: Z6 _; f: S1 u. y) Q6 M
11.png
选择芯片型号
       使用STM32CUBEMX选择芯片stm32f030r8,如下所示:
. l- r8 y0 `' J7 P
12.png
配置时钟源
    HSE与LSE分别为外部高速时钟和低速时钟,在本文中使用内置的时钟源,故都选择Disable选项,如下所示:
" ?2 i  d5 i$ a
13.png
配置时钟树
    STM32F0的最高主频到48M,所以配置48即可:4 F9 G3 J5 S" L
14.png
串口配置
    本次实验使用的串口1进行串口通信,波特率配置为115200。1 K- D1 c. k" @) y4 @1 h
15.png
定时器配置
   本次使用定时器1的通道2进行检测,配置入下。" e4 B4 t4 Z7 ]9 t
红外接收管
    这里使用VS838的接收管,如下所示:! I: A5 R! y6 X# q# {
16.png
红外编码
     这里使用VS838的接收管,如下所示:
9 t3 n0 I2 v4 L# u
17.png
NEC协议载波:38khz* I) j5 q/ l5 z! M+ W: B
18.png
# R) ]; p2 v! P; g* B# D

, u3 m* W9 A! T5 \
自定义红外编码
    本文中数据1的低占空比设置为1120us,总时间为1.68ms,不是上图的2.25ms。
' k1 ~7 }0 B2 Q  e& k3 B    协议如下:
1 a, x# k/ u: L0 [+ `8 z
19.png
生成工程设置
    注意在生产工程设置中不能出现中文,不然会报错。
6 j+ k& P' U8 d- U/ a
20.png
代码生成设置
    最后设置生成独立的初始化文件:- ?0 r$ R" i7 a; [
21.png
生成代码
22.png
配置keil
23.png
24.png
    在main.c中,添加头文件,若不添加会出现 identifier "FILE" is undefined报错。
# l! w' W) k' _) x8 b) V( t( O1 ]

  1. " `% D3 C& g. `8 k, w3 r
  2. /* USER CODE BEGIN Includes */
    $ @# ~) b1 K0 ^$ v* ?! S7 z% o
  3. #include "stdio.h"
    5 `% W  l' a3 b
  4. /* USER CODE END Includes */
复制代码
红外接收口定义 。4 q# }- y; g0 r: s

  1. * \8 a5 q' S7 k  o8 Z- [
  2. /* USER CODE BEGIN PTD */
    7 C0 d. c$ Z4 H; \& d
  3. #define IR_IN1 HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_9)
    0 F) j5 G: r9 L# D
  4. /* USER CODE END PTD */
复制代码
  函数声明和串口重定向:3 k, S7 K' q1 ?: H$ I

  1. , a9 \' L: {0 I: `8 Q3 l
  2. /* USER CODE BEGIN PFP */
    % ]" y0 w& e/ u3 U0 q  A# f
  3. #ifdef __GNUC__
    : ~" Z2 N0 I0 R0 X$ F
  4. #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)3 v, O+ y$ z" K
  5. #else
    ( C7 ]/ O; y9 J1 t
  6. #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
    - Z+ V, y+ {* x: @* g" w& t
  7. #endif /* __GNUC__ */
    5 P7 t* @1 L3 o4 Q2 V
  8. PUTCHAR_PROTOTYPE
    ' K0 U! T+ V" o
  9. {
    * Y/ K0 b: S" c& o) N% @
  10.     HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);+ c: M% y# b3 j& z3 n8 a2 z
  11.     return ch;6 Z" S; N# K; j7 ]* C, _
  12. }. P. {: c2 T. C* p7 Y
  13. /* USER CODE END PFP */
复制代码
  定时器配置:: r. g" [' m9 y# @: ?2 s
  1.   /* USER CODE BEGIN 2 */+ z0 W( m+ t/ Z
  2.   HAL_TIM_Base_Start_IT(&htim1);//启动定时器
    + f! M7 i& z) ^$ A+ b
  3.   HAL_TIM_IC_Start_IT(&htim1,TIM_CHANNEL_2);//函数用于使能定时器某一通道的输入捕获功能,并使能相应的中断9 Y; u2 H- |7 g# j# \4 b! d" M; B
  4.   printf("IR Capture !! \r\n");+ g1 r3 o! _. U6 u. i6 x
  5.   /* USER CODE END 2 *
复制代码
  红外接收代码' Z  |2 c4 H# m. W6 P& p1 ]

' E# r, N2 U! ^* O& Z
# ~  ^, j) I7 z; O5 C/ r! P) U* W3 J
[4400,5000]是用于捕获4.5ms的信号
) G9 E% J" W# T0 X5 r6 h# r( }& D  I, J6 ]+ \, f

* R  c& u1 L4 F5 o4 C6 `7 i8 e; d[550,700]是用于捕获560us的数据0信号3 n; F9 \" m1 W! Q& Z1 @

  A+ \7 R* _% Y. ]& Q$ j

- e- V$ [) E7 n* S6 e[1100,1250]是用于捕获1120us的数据1信号
, u: J0 {5 F. R& Y& b+ q/ N" ]/ H( n& y. E, l( K
- I9 Z- J, t. m. v
[2000,2500]是用于捕获2240us的截止位信号
0 Q. a8 C. n, f3 x$ S( N6 x0 x
  1. ' S" Y) S+ S  r5 h$ S5 I
  2. /* USER CODE BEGIN 4 */
    + M% n- [, K  e+ a+ N" @/ y* n' M
  3. // 捕获中断回调函数,每次捕获到信号就会进入这个回调函数
    ) j3 @& ~% k4 b* @3 d) U) z2 ?# T
  4. void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
    6 a; ~; a, D) c" K4 e5 Q
  5. {
    9 j/ e- T) j! Z! G& X7 r" q6 Q
  6.   uint32_t fallingCount = 0 ; // 下降沿计数
    / Y- x" }2 D/ \' p) r
  7.   uint8_t temp = 0 ;
      e8 \( C. t8 b6 t# r' N& L  p
  8.   // 判断是否是定时器1的外部捕获口26 H" c8 a1 Y2 u6 N
  9.   if(htim->Instance == TIM1)
    " m# A8 Y* n+ a7 i- p, @
  10.   {
    , O3 k$ H  p9 i7 X& U; K6 |
  11.     // 捕获到了上升沿
      \+ J' b, K, y+ a- m* Y$ H
  12.     if(IR_IN1)- r) k/ J6 }  B+ A
  13.     {
    ' q7 j9 `1 B2 V7 q4 w) a
  14.       __HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_2, TIM_INPUTCHANNELPOLARITY_FALLING); // 改变捕获极性为下降沿捕获4 F& }/ l. c! s1 G
  15.       __HAL_TIM_SET_COUNTER(htim, 0); // 计数清零,从头开始计
    - J! T3 W# N6 R' Y
  16.     }
    6 v, }0 w. Z- u
  17.     else
    & U& s2 w. e6 P  P, Q4 ]* J/ B
  18.     {
    5 `$ U/ b. {0 s6 w
  19.       fallingCount = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_2); // 读取捕获计数,这个时间即为上升沿持续的时间! N( c0 ^% E7 O1 {* o2 q
  20.       __HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_2, TIM_INPUTCHANNELPOLARITY_RISING); // 改变捕获极性为上升沿捕获; v: U7 t: T; S! n
  21.       if( ((fallingCount > 4400) && (fallingCount <5000))) % l3 D# {( ]& x3 m% r! {5 f
  22.         OK = 1;/// 4.5ms引导电平6 Q5 p* r: g: i* w' F
  23.       else if (((fallingCount > 550) && (fallingCount < 700)))  
    " j6 t$ }$ Z3 ~
  24.       {
    ' ]+ [) W0 x! L, N
  25.         temp = 0;//560 us,数据为0
      J+ b5 L: c5 d7 i4 X' m
  26.       }  
    7 {  V% Y# z! k8 ^4 \) ~
  27.       else if (((fallingCount > 1100) && (fallingCount < 1250)))
    + m9 v7 N! c& c. Y2 }. p+ z$ w9 N
  28.       {: h5 W3 h: A7 {/ P
  29. / v" I( i9 s# V3 j( J% W( U# Z% S
  30.         temp = 1;//1120 us,数据为1
    , K2 `+ d5 j, r
  31.       }" e; X" M# R- q. V+ [' m' [

  32. , E( g* Q) Q) i& H9 y7 |9 l6 {& l
  33.       else if (ReadyFlag==0&& ((fallingCount > 2000) && (fallingCount < 2500)))  //2.240ms截止码) a9 k9 s2 l; e
  34.       {
    ; [9 H5 g! a1 b
  35.         ReadyFlag = 1 ;+ m3 z% d3 N- I8 z+ C# y
  36.         OK = 0;* b* T, G: z5 m
  37.       }" R+ E) {. \& {6 X  l
  38.       if(OK)$ W# z; Z( n  \* I9 B
  39.       {
    ! e# R8 T8 g7 B" w, j) K$ |2 o' t4 V
  40.         OrderData <<= 1 ;
    ( D1 w5 b8 b* l, s% O" Y* @* v7 h
  41.         OrderData += temp ;6 {- {& Q0 E8 h! i: a9 |# ^& R
  42.         KeyCount = 0; // 按键次数( i9 s# r* P  N9 m
  43.       }
    5 l! Z- n. z/ z- U2 R4 ?
  44.     }8 M, d" Y4 t9 E( ^# c
  45.   }
    % p0 ]0 V" o8 x) L7 C0 _7 S
  46. }
    - Y# c3 z5 u. ~, j
  47. /* USER CODE END 4 */
复制代码
   主函数。
4 a" K3 O5 F3 q  C; a2 Z$ H
  1. /* USER CODE BEGIN WHILE */
    $ I' ^" o  V1 \  {/ ~' |
  2.   while (1)4 ~3 y* \( u" A5 K# ?
  3.   {$ u  }9 J" q- @
  4.     /* USER CODE END WHILE */# B9 o6 f- p; K+ I

  5. ) |/ W1 ^3 u% Y5 L9 R- H0 b
  6.     /* USER CODE BEGIN 3 */
    ! s8 f8 C$ v5 i/ Z5 b% @6 Z  t- S+ M
  7.     if(ReadyFlag)
    ; n0 k0 j6 X/ a; m
  8.     {
    - i6 s: {4 v& y5 R3 A8 L  Q/ D
  9.       printf("order=%08X , code=%d\r\n",OrderData,OrderData);$ w+ n& a" K8 p4 k( k' U; t
  10.       OrderData = 0;5 L. u) T1 K6 ]# h- E5 c) P
  11.       OK = 0;
    / n9 s' J/ l$ h. B! B% P
  12.       ReadyFlag = 0;    1 R$ j0 C# d" ^% I
  13.     }
    4 n, E3 r- X! G
  14.   }
复制代码
演示效果
    红外连续发送5次码值,发送分别为:
& j2 r8 c; e  b; h
, J6 _( h5 \1 q7 `/ o

- z, O; F3 P! N1 A  H1011(11)
, u: Z, g) y" n3 Y5 X* J11 1010(58)) j  T7 c% H' ?/ I0 k; Q( O( \1 t
11 0001(49)
9 D) x/ p* ^# P/ {11 1111(63)
/ f% {( e9 |3 g/ g2 K11 0011(51)
' ?# X+ W# l. J) P! v8 |, N    分别如下所示:1 G( h2 i, R& `4 A% \

9 o" n  Z' x8 G

9 ]& ], c0 v3 w, z. b' c  X% |, [8 z
2 l" G' A/ v, b

, B% H/ o. B$ h4 z, l3 }0 a( A. U
收藏 评论1 发布时间:2020-12-2 13:01

举报

1个回答
goyhuan 回答时间:2020-12-2 14:53:02
红外接收很通用
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版