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

STM32WLE5系列之2-stm32wle5ccu6移植pingpong通信

[复制链接]
STMCU小助手 发布时间:2022-10-20 18:31
简介
; _1 N' S9 `4 z3 @( G% n# @% a官方只提供了STM32WL55JC和STM32WL55JC1的相关应用demo,由于封装不通我们并不能直接使用相关程序,需要移植才能使用。本次我们移植pingpong通信demo
4 Y3 t# i, d4 C/ g6 Z& n( j5 E& G" K2 C4 E$ D( y: J
一、工程移植
, r0 H! F( S" N( C! F' a/ Y4 m7 ?1、打开STM32CubeMX,选择start My projext from MCU开始工程
/ E3 E- m0 ^$ M+ b
* x9 i" e8 }4 R2 E0 x
c9c595898d0843dcac0e6d3cb4e1e6be.png
/ u8 ]. D3 S" L; O4 q8 e
, r6 [& l5 \/ s6 w; |. Q  f2、在MCU/MPU处选择使用STM32WLE5CCU6
2 Q% w0 E- Q7 o* t3 x0 D' N

/ d/ T: A7 M$ D2 Z' R# X ce759cf2bb994e39bcba330374887923.png
, U3 [& W+ N- W/ m% G' O: a6 ]% \5 w3 ~0 F  T" \
3、在File->import project导入pingpong例程,选择导入工程为C"\Users\用户\STM32Cube\Repository\STM32CuBE_FW_WLV1.2.0\Projects\NUCLEO-WL55JC\Applications\SubGHz_Phy\SubGHz_Phy_PingPong\SubGHz_Phy_PingPong.ioc
* u4 k! ?5 h. o* U4 W" q3 R+ H用户为自己实际的用户名
* r1 l# ~& V+ R- Z  u
* y, A: {% s% \3 M* [
eabbd354683c4d7791a658576c0f3cfb.png % [) a5 |% ^1 Q6 l' O. [

2 @3 p% R' a# j6 c2 h导入后会有些报错,是因为原来WL55JC是BGA的封装引脚要多一些,而stm32wle5ccu6没有
9 H' m) U- U2 T7 W2 W0 E
1 B2 C9 {/ v6 b, d4、在Project Manager->Project中设置工程名和存放路径,Toolchain/IDE设置为MDK-ARM;Code Generator设置为Copy all used libraries into the project folder- O' O+ ?) b( ^( ?9 `

2 g3 ~) R9 d, a& C# s; B$ h: a/ v% o
d36a100f0c024b99986d29f6c8370795.png
# J! u8 H/ r/ U- @. R8 r. M1 I* o+ P+ {9 Z
6018d91799ac4fb49e1fd28312a41a29.png 7 w9 C6 @8 [! [- A
. a% V" Z* R5 q& H5 S: L
5、时钟输入配置,HSE和LSE都配置为Crystal/Ceramic Resonator
: _- t, l0 c- Q$ A# d! R2 @+ i8 P/ r3 J- Q
) m# j3 ?. s; v. H/ c
bc99cbb8fda944e6a771fc51fba34ba8.png 2 p" b/ `  |. g* [8 ^

  e! ]% u( r; g( ^5 y6、RTC开启Alarm A并且使能中断
& |7 _0 g4 E8 W/ M  E* A) C6 W) X. J; M1 ^8 v* b
8 B1 }: k' d* h) M9 c5 s/ [
bb49a01df25445b3a4feed59805c9604.png ! X& f9 U5 k' f5 B

" @, s+ _" E) Q0 T7、SubGHz_Phy设置如下
0 X2 g7 b7 b3 O( i' z( _3 _! O/ _9 A$ K1 t3 X
ad6a96941ad0469faa47dc07d76a261f.png & a' z/ v% r' S. ?  C3 e
; Y/ s+ U7 {" b9 a
d4d2c6841cc64814a211c1d22d56e6d0.png
1 |5 s! N4 {$ f2 p$ i
  X! Z2 v+ ^. E, P8、时钟树配置,RTC使用LSE
4 F/ [6 W+ H5 |4 G9 W! S
; \' p( G0 z7 z5 E; B/ V# O 37d50e58e60149cdbb1d69c2afe8a907.png 7 h( \+ D; N( k- s* w1 a
( g% s! D1 s0 ?2 j1 f* A5 j6 s
9、点击GENERATE CODE生成代码,打开keil工程然后编译会报以下错误,是由于我们没有添加BSP包3 Y. |. P" T" @4 Z) x  |. t

; d* ^) r% E' n3 n ff851680b0df4c93b9154d53d0b91cd2.png
6 a! ^; ]: t$ s! r  M) j- {. H* e
10、把下载的软件包C:\Users\用户\STM32Cube\Repository\STM32Cube_FW_WL_V1.2.0\Drivers中的BSP包拷贝到当前工程下。然后在keil中添加文件和其所在目录索引。
/ {0 S9 _- \! p$ u* j* W11、然后编译工程,0 error 0 waring8 L1 ]. \" F0 F8 E

# D9 i3 Y% |, L$ [/ F# F$ G( k 665fd274877f46bc90aa4e614e88c0f5.png
5 x( _2 n, K- M9 i  ^8 T
4 R- K( z0 p7 e1 H, M: C二、应用移植
- x9 w; Y& W6 `1、修改BSP中关于射频开关部分的引脚定义,我们使用的亿佰特的E77模块,所以射频开关为PA6和PA7
" d" C3 Z3 ?0 q  `) b& Ostm32wlxx_nucleo_radio.h修改为下面这样,我们只使用了RF_SW_CTRL3_PIN、RF_SW_CTRL1_PIN 两个脚,另一个不用管。
; \- v% ?& y3 a% k- y' Y+ e- E) G! ^9 A$ h, [# n; M/ u
  1. <font color="#000000" face="Tahoma" size="3">#define RF_SW_CTRL3_PIN                          GPIO_PIN_6</font>4 |" W) F5 r" B2 D& v
  2. <font color="#000000" face="Tahoma" size="3">#define RF_SW_CTRL3_GPIO_PORT                    GPIOA</font>
    % v& U% `. K" V& X- F8 J
  3. <font color="#000000" face="Tahoma" size="3">#define RF_SW_CTRL3_GPIO_CLK_ENABLE()            __HAL_RCC_GPIOC_CLK_ENABLE()</font>! _6 A0 }4 }3 p
  4. <font color="#000000" face="Tahoma" size="3">#define RF_SW_CTRL3_GPIO_CLK_DISABLE()           __HAL_RCC_GPIOC_CLK_DISABLE()</font>
    1 m5 k: H6 t" A0 E$ u$ D

  5. 3 Z/ N' |2 }! g0 Y0 H8 H
  6. <font color="#000000" face="Tahoma" size="3">#define RF_SW_CTRL1_PIN                          GPIO_PIN_7</font>2 U8 E. w) A8 N2 E1 }: B7 o; t7 ?
  7. <font color="#000000" face="Tahoma" size="3">#define RF_SW_CTRL1_GPIO_PORT                    GPIOA</font># \3 G4 ~  [1 B/ t5 @7 k/ }5 u
  8. <font color="#000000" face="Tahoma" size="3">#define RF_SW_CTRL1_GPIO_CLK_ENABLE()            __HAL_RCC_GPIOC_CLK_ENABLE()</font>
    7 {- |! F  `" N) j# N
  9. <font color="#000000" face="Tahoma" size="3">#define RF_SW_RX_GPIO_CLK_DISABLE()              __HAL_RCC_GPIOC_CLK_DISABLE()</font>
复制代码

- W+ P9 |: h. K( y. T' G. n+ y由于射频开关不同,射频控制逻辑也需要修改,把stm32wlxx_nucleo_radio.c中射频开关修改如下所示5 f* U" R3 [% Y4 k0 P; z
6 m1 ~) e" |( L* j+ |6 k: k2 k  ~. N
  1. <font color="#000000" face="Tahoma" size="3">int32_t BSP_RADIO_ConfigRFSwitch(BSP_RADIO_Switch_TypeDef Config)</font>- E( `: D: ~' {. F" J' E% E
  2. <font color="#000000" face="Tahoma" size="3">{</font>
      W5 b& |, }* b# j8 `
  3. <font color="#000000" face="Tahoma" size="3">  switch (Config)</font>1 y- x9 V7 r* B7 F( X9 O
  4. <font color="#000000" face="Tahoma" size="3">  {</font>; K* E0 i, N+ |% ?
  5. <font color="#000000" face="Tahoma" size="3">    case RADIO_SWITCH_OFF:</font>
    - v' B# q  K3 v
  6. <font color="#000000" face="Tahoma" size="3">    {</font>& y* d- j  h+ t2 x- j
  7. <font color="#000000" face="Tahoma" size="3">      /* Turn off switch */</font>
    1 J  H% o2 o2 \: t$ }
  8. <font color="#000000" face="Tahoma" size="3">      HAL_GPIO_WritePin(RF_SW_CTRL3_GPIO_PORT, RF_SW_CTRL3_PIN, GPIO_PIN_RESET);</font>
    0 ~# ^* A% I$ Q' ?) s+ Z
  9. <font color="#000000" face="Tahoma" size="3">      HAL_GPIO_WritePin(RF_SW_CTRL1_GPIO_PORT, RF_SW_CTRL1_PIN, GPIO_PIN_RESET);</font>
    9 u( L% r5 ]) |9 w+ {
  10. <font color="#000000" face="Tahoma" size="3">      HAL_GPIO_WritePin(RF_SW_CTRL2_GPIO_PORT, RF_SW_CTRL2_PIN, GPIO_PIN_RESET);</font>
    ! P+ i/ N7 o+ \4 a) T& _8 Q
  11. <font color="#000000" face="Tahoma" size="3">      break;      </font># s4 C1 h$ p5 `1 k
  12. <font color="#000000" face="Tahoma" size="3">    }</font>: K. R- n* [5 u+ p5 D
  13. <font color="#000000" face="Tahoma" size="3">    case RADIO_SWITCH_RX:</font>
    ! u8 y: P' d; r) G: n4 `7 L
  14. <font color="#000000" face="Tahoma" size="3">    {</font>
    ! V: V0 c6 n7 \  J* m' }# e; I
  15. <font color="#000000" face="Tahoma" size="3">      /*Turns On in Rx Mode the RF Switch */</font>+ j0 G; f; g- m4 N# T, _$ [
  16. <font color="#000000" face="Tahoma" size="3">      HAL_GPIO_WritePin(RF_SW_CTRL3_GPIO_PORT, RF_SW_CTRL3_PIN, GPIO_PIN_RESET);</font>6 I1 B# I. r4 }8 I% g" n8 k( ?
  17. <font color="#000000" face="Tahoma" size="3">      HAL_GPIO_WritePin(RF_SW_CTRL1_GPIO_PORT, RF_SW_CTRL1_PIN, GPIO_PIN_SET); </font>
    ) N2 {7 w3 w* S
  18. <font color="#000000" face="Tahoma" size="3">      HAL_GPIO_WritePin(RF_SW_CTRL2_GPIO_PORT, RF_SW_CTRL2_PIN, GPIO_PIN_RESET); </font>3 E" T1 y7 b8 `& i1 f
  19. <font color="#000000" face="Tahoma" size="3">      break;</font>& [* C# i7 ]+ O: q1 }/ r# M% {
  20. <font color="#000000" face="Tahoma" size="3">    }</font>
    6 ]  @0 n1 o1 D9 S: J* q9 W* \- w
  21. <font color="#000000" face="Tahoma" size="3">    case RADIO_SWITCH_RFO_LP:</font>
    - O3 d3 u2 [) o( u4 D, @9 C8 i
  22. <font color="#000000" face="Tahoma" size="3">    {</font>, E7 L' w0 B* [. r: T
  23. <font color="#000000" face="Tahoma" size="3">      /*Turns On in Tx Low Power the RF Switch */</font>0 Z# a7 m3 Y. d3 u  b! t
  24. <font color="#000000" face="Tahoma" size="3">      HAL_GPIO_WritePin(RF_SW_CTRL3_GPIO_PORT, RF_SW_CTRL3_PIN, GPIO_PIN_SET);</font>
    " `1 i) P5 a2 D
  25. <font color="#000000" face="Tahoma" size="3">      HAL_GPIO_WritePin(RF_SW_CTRL1_GPIO_PORT, RF_SW_CTRL1_PIN, GPIO_PIN_RESET); </font>0 k) d' q& [0 s% I- D
  26. <font color="#000000" face="Tahoma" size="3">      HAL_GPIO_WritePin(RF_SW_CTRL2_GPIO_PORT, RF_SW_CTRL2_PIN, GPIO_PIN_SET); </font>
    8 z2 y6 Q' o* v
  27. <font color="#000000" face="Tahoma" size="3">      break;</font>
    # T( @! |. h7 g& C
  28. <font color="#000000" face="Tahoma" size="3">    }</font>
    5 A( ~) l" \3 V3 K/ A9 D
  29. <font color="#000000" face="Tahoma" size="3">    case RADIO_SWITCH_RFO_HP:</font>: i: ^) P. K. i2 {  F4 k: N
  30. <font color="#000000" face="Tahoma" size="3">    {</font>: f4 c  l6 g9 |1 z
  31. <font color="#000000" face="Tahoma" size="3">      /*Turns On in Tx High Power the RF Switch */</font>: G! K& U! x( E" w4 E, ?, p' r
  32. <font color="#000000" face="Tahoma" size="3">      HAL_GPIO_WritePin(RF_SW_CTRL3_GPIO_PORT, RF_SW_CTRL3_PIN, GPIO_PIN_SET);</font>; |2 p5 g1 z/ e% N9 O
  33. <font color="#000000" face="Tahoma" size="3">      HAL_GPIO_WritePin(RF_SW_CTRL1_GPIO_PORT, RF_SW_CTRL1_PIN, GPIO_PIN_RESET); </font>, a' H4 Z# I* L  l" x
  34. <font color="#000000" face="Tahoma" size="3">      HAL_GPIO_WritePin(RF_SW_CTRL2_GPIO_PORT, RF_SW_CTRL2_PIN, GPIO_PIN_SET); </font># h: D: c5 v; [( h/ }' x; y0 }, c
  35. <font color="#000000" face="Tahoma" size="3">      break;</font>
    1 q0 n! b7 [8 K3 y* V+ c' l& F; _: O# ~
  36. <font color="#000000" face="Tahoma" size="3">    }</font>
    4 a! h  S/ `0 t( E6 O' U6 P
  37. <font color="#000000" face="Tahoma" size="3">    default:</font>
    " X( C' i# l& P: t. ~& o
  38. <font color="#000000" face="Tahoma" size="3">      break;    </font>9 P& l  E/ T: k0 M2 G( N  C
  39. <font color="#000000" face="Tahoma" size="3">  }  </font>
    0 Q  O; e' m: l4 L: o5 S

  40. , M. g5 d9 W* h
  41. <font color="#000000" face="Tahoma" size="3">  return BSP_ERROR_NONE;</font>6 \3 L  M2 Q3 B# h! T/ a4 i5 `
  42. <font color="#000000" face="Tahoma" size="3">}</font>
    5 z8 B0 C6 w, N. ^; Q/ g" F4 s
  43. 5 r" U' i( J! W# v; _' y" G
  44. <font color="#000000" face="Tahoma" size="3">int32_t BSP_RADIO_GetTxConfig(void)</font>. T6 ~$ @. G# t0 B1 n! O4 x; O
  45. <font color="#000000" face="Tahoma" size="3">{</font>  O% A. F3 f& D8 A. h# A. R- A
  46. <font color="#000000" face="Tahoma" size="3">  //return RADIO_CONF_RFO_LP_HP;</font>
    9 E5 F3 q. |( J, Z: U* r3 y8 P9 Q
  47. <font color="#000000" face="Tahoma" size="3">        return RADIO_CONF_RFO_HP;</font>0 S( l) d) P1 |0 L4 M# n
  48. <font color="#000000" face="Tahoma" size="3">}</font>
    ; F3 p& ^7 T/ s$ n) V' n* q9 [

  49. ; q( W7 r0 d9 A) q
  50. <font color="#000000" face="Tahoma" size="3">//</font>
    + t4 y  c$ ?% ~: c% ~
  51. <font color="#000000" face="Tahoma" size="3">//使用无源晶振</font>
      N# ?) ^$ B/ B: x" h+ O+ g* F9 _1 O
  52. <font color="#000000" face="Tahoma" size="3">/**</font>, f& m% S: B) X  Q0 a
  53. <font color="#000000" face="Tahoma" size="3">  * @brief  Get If TCXO is to be present on board</font>
    ' r# _" A; k& l( s) _& Z$ c
  54. <font color="#000000" face="Tahoma" size="3">  * @note   never remove called by MW,</font>
    # N& D* V7 E3 c$ U, F
  55. <font color="#000000" face="Tahoma" size="3">  * @retval</font>$ G9 f$ r* R/ [/ N
  56. <font color="#000000" face="Tahoma" size="3">  *  RADIO_CONF_TCXO_NOT_SUPPORTED</font>2 |4 \8 a6 P1 c7 m# F9 ^) g5 a
  57. <font color="#000000" face="Tahoma" size="3">  *  RADIO_CONF_TCXO_SUPPORTED</font>" [0 i, h  L: a( ~6 e1 R+ e
  58. <font color="#000000" face="Tahoma" size="3">  */</font>
    3 t/ }* `* r0 }* Y; W$ u5 R! w3 Y
  59. <font color="#000000" face="Tahoma" size="3">int32_t BSP_RADIO_IsTCXO(void)</font>
    4 v! N! T8 H7 U: I" ?- ?2 u; d
  60. <font color="#000000" face="Tahoma" size="3">{</font>
    4 x0 D, f0 w& w# D
  61. <font color="#000000" face="Tahoma" size="3">  //return RADIO_CONF_TCXO_SUPPORTED;</font>
    3 I, a% r# G0 T& r/ ^/ I( w
  62. <font color="#000000" face="Tahoma" size="3">        return RADIO_CONF_TCXO_NOT_SUPPORTED</font>
    ; t2 U& p+ S8 I" z9 H  K
  63. <font color="#000000" face="Tahoma" size="3">}</font># k6 ?: |9 \7 O3 O9 b
  64. <font color="#000000" face="Tahoma" size="3">由于亿佰特的E77模块使用的是无源晶振,所以需要调整晶振负载电容以保证晶振精度</font>% A, v. @- @0 }) g3 m: o2 T7 h
  65. <font color="#000000" face="Tahoma" size="3">(这里不调整也可,因为是两个模块互通,但考虑后面lorawan工程还是调整为好),采用</font>& s6 M" J  ?8 W  Q
  66. <font color="#000000" face="Tahoma" size="3">模块厂商推荐值0x0B</font>) R5 ]) E3 [! z. e
  67. <font color="#000000" face="Tahoma" size="3">//#define XTAL_DEFAULT_CAP_VALUE      ( 0x20UL )</font>9 {! \4 Z; `4 q
  68. <font color="#000000" face="Tahoma" size="3">#define XTAL_DEFAULT_CAP_VALUE      ( 0x0BUL )</font>
复制代码
  y2 k0 a& W  X2 Y6 i/ f8 k, O: u
2、修改subghz_phy_app.c文件,CubeMx刚生成工程是没有应用程序的。我们只需要从STM32Cube_FW_WL_V1.2.0软件包中去找到对应的工程文件然后修改,修改后的subghz_phy_appp.c如下。
: O. U) Y7 \& I8 E$ W
7 B" [3 K( `$ A8 m+ Z) G
  1. <font color="#000000" face="Tahoma" size="3">/* USER CODE BEGIN Header */</font>; u* n) M2 J# i" s4 @( [* o! y
  2. <font color="#000000" face="Tahoma" size="3">/**</font>
    + r& x+ |6 h1 M, X2 e
  3. <font color="#000000" face="Tahoma" size="3">  ******************************************************************************</font>: l$ w* K8 [2 v- m- H
  4. <font color="#000000" face="Tahoma" size="3">  * @file    subghz_phy_app.c</font>( h! ~0 c2 x: Q3 V1 J
  5. <font color="#000000" face="Tahoma" size="3">  * @author  MCD Application Team</font>
    % r8 }# @1 q9 u' U+ F
  6. <font color="#000000" face="Tahoma" size="3">  * @brief   Application of the SubGHz_Phy Middleware</font>% I0 D1 \* w& p: H6 K- ]; T* e
  7. <font color="#000000" face="Tahoma" size="3">  ******************************************************************************</font>9 r+ A: t) `! p+ Y7 g
  8. <font color="#000000" face="Tahoma" size="3">  * @attention</font>- S% E9 }# R- l
  9. <font color="#000000" face="Tahoma" size="3">  *</font>
    - n9 ]1 X1 h" \. y2 x
  10. <font color="#000000" face="Tahoma" size="3">  * Copyright (c) 2022 STMicroelectronics.</font>
    6 }! ~: k5 ?0 r+ d
  11. <font color="#000000" face="Tahoma" size="3">  * All rights reserved.</font>
    / N8 @. d6 _* I: X/ G5 I
  12. <font color="#000000" face="Tahoma" size="3">  *</font>* n" ^& T- `' O: K( g
  13. <font color="#000000" face="Tahoma" size="3">  * This software is licensed under terms that can be found in the LICENSE file</font>& I4 j5 E# R) H- K+ t  L  C
  14. <font color="#000000" face="Tahoma" size="3">  * in the root directory of this software component.</font>
    ) ?0 U: c2 [% I  R! q4 N& E8 _
  15. <font color="#000000" face="Tahoma" size="3">  * If no LICENSE file comes with this software, it is provided AS-IS.</font>3 k" L" R, [% @1 d6 a
  16. <font color="#000000" face="Tahoma" size="3">  *</font>1 |2 Y) E" L1 ^" d0 L' u2 r7 k
  17. <font color="#000000" face="Tahoma" size="3">  ******************************************************************************</font>; I7 v1 P9 }  R! A' T; c% w  w
  18. <font color="#000000" face="Tahoma" size="3">  */</font>
    6 v+ m- u0 ]- S6 o! ~" w! @, e
  19. <font color="#000000" face="Tahoma" size="3">/* USER CODE END Header */</font>
    5 ^2 |- i/ j* z1 f4 V

  20. ( j) o$ m) V! ]+ a. k4 T' k
  21. <font color="#000000" face="Tahoma" size="3">/* Includes ------------------------------------------------------------------*/</font>
    ) }2 g0 C9 N: F
  22. <font color="#000000" face="Tahoma" size="3">#include "platform.h"</font>* n3 C# p  z6 Q# Z1 z
  23. <font color="#000000" face="Tahoma" size="3">#include "sys_app.h"</font>
    7 [, [. k% E* `  @9 H
  24. <font color="#000000" face="Tahoma" size="3">#include "subghz_phy_app.h"</font>
    . t( m2 @6 c$ L/ y2 Y0 p& `
  25. <font color="#000000" face="Tahoma" size="3">#include "radio.h"</font>& E  q+ o3 X% `  g

  26. 6 c' G9 M5 [" r! V
  27. <font color="#000000" face="Tahoma" size="3">/* USER CODE BEGIN Includes */</font>3 c8 y* c' O1 j4 o+ t* O  V# {
  28. <font color="#000000" face="Tahoma" size="3">#include "stm32_timer.h"</font>* G1 @: l$ e/ Z" ~3 H- k  a: J
  29. <font color="#000000" face="Tahoma" size="3">#include "stm32_seq.h"</font>
    . }: k# j1 ]) q) m1 e" `/ L
  30. <font color="#000000" face="Tahoma" size="3">#include "utilities_def.h"</font>9 z; ]- [  B) Z' ]1 I
  31. <font color="#000000" face="Tahoma" size="3">#include "app_version.h"</font>. u: w5 ~( @1 U  B, M" P
  32. <font color="#000000" face="Tahoma" size="3">#include "subghz_phy_version.h"</font>& V6 ^' o' l8 H$ D& v4 w$ }4 A
  33. <font color="#000000" face="Tahoma" size="3">/* USER CODE END Includes */</font>$ ~' {! {9 ]  ]

  34. / @- d% z- S) q+ O5 }8 l
  35. <font color="#000000" face="Tahoma" size="3">/* External variables ---------------------------------------------------------*/</font>* i/ ?- h6 `- N/ Y, O3 H6 |
  36. <font color="#000000" face="Tahoma" size="3">/* USER CODE BEGIN EV */</font>- b& y) W3 w: ?
  37. $ p' h' @* `( @+ i" ?5 h2 ]9 ^( K2 l
  38. <font color="#000000" face="Tahoma" size="3">/* USER CODE END EV */</font>
    8 E, t+ |3 @7 j) u9 P' v4 j
  39. 0 I1 P1 ^& z& ]2 e+ i, I* w
  40. <font color="#000000" face="Tahoma" size="3">/* Private typedef -----------------------------------------------------------*/</font>& O/ Y, p3 `2 V, n/ W# l' E# Z

  41. $ v4 r) y( u' ?8 ?5 P- Y, i* V, J
  42. <font color="#000000" face="Tahoma" size="3">/* USER CODE BEGIN PTD */</font>( q3 z1 I, F  S0 `% C: }
  43. <font color="#000000" face="Tahoma" size="3">typedef enum</font>
    : c+ J' F) j8 }. j' i# N
  44. <font color="#000000" face="Tahoma" size="3">{</font>
    3 a& W& q7 Q8 w/ P5 Z1 }: l) O
  45. <font color="#000000" face="Tahoma" size="3">  RX,</font>' p& Z2 U% a0 |
  46. <font color="#000000" face="Tahoma" size="3">  RX_TIMEOUT,</font>
    . f0 a$ E2 q9 ]  }
  47. <font color="#000000" face="Tahoma" size="3">  RX_ERROR,</font>  P" c5 f$ q( d! l; t
  48. <font color="#000000" face="Tahoma" size="3">  TX,</font>8 [: T' R/ D8 C! i/ w2 D; C! r
  49. <font color="#000000" face="Tahoma" size="3">  TX_TIMEOUT,</font>" [" i) l2 l) U. n( J
  50. <font color="#000000" face="Tahoma" size="3">} States_t;</font>  C/ U% w4 n( ~- S' X9 c
  51. <font color="#000000" face="Tahoma" size="3">/* USER CODE END PTD */</font># G% {* a+ F$ l1 H2 C* l
  52. . y: A! S7 i3 p  v
  53. <font color="#000000" face="Tahoma" size="3">/* Private define ------------------------------------------------------------*/</font>( h' L% K- p% x6 ]' X/ t
  54. <font color="#000000" face="Tahoma" size="3">/* USER CODE BEGIN PD */</font>8 l# }" }2 z  m5 w. Z1 X
  55. <font color="#000000" face="Tahoma" size="3">/* Configurations */</font>, C5 a- L+ V3 U" w$ Q7 @4 l
  56. <font color="#000000" face="Tahoma" size="3">/*Timeout*/</font>) R# E5 D7 P5 ^9 \
  57. <font color="#000000" face="Tahoma" size="3">#define RX_TIMEOUT_VALUE              3000</font>
    " a: r8 N- ~5 |7 v+ q- f$ |
  58. <font color="#000000" face="Tahoma" size="3">#define TX_TIMEOUT_VALUE              3000</font>- t6 M1 j+ [: t: E  y
  59. <font color="#000000" face="Tahoma" size="3">/* PING string*/</font>! b1 v  G, Y9 l' M
  60. <font color="#000000" face="Tahoma" size="3">#define PING "PING"</font>, X7 U  H/ ^8 ^
  61. <font color="#000000" face="Tahoma" size="3">/* PONG string*/</font>
    0 S6 p$ r& ^0 V. {
  62. <font color="#000000" face="Tahoma" size="3">#define PONG "PONG"</font>
    7 d9 Z' J6 ]+ J4 f9 H
  63. <font color="#000000" face="Tahoma" size="3">/*Size of the payload to be sent*/</font>) v! e5 x$ c; v/ z
  64. <font color="#000000" face="Tahoma" size="3">/* Size must be greater of equal the PING and PONG*/</font>; ^1 w( }2 n: I6 ^, G
  65. <font color="#000000" face="Tahoma" size="3">#define MAX_APP_BUFFER_SIZE          255</font>1 |* z" x( V# J4 m& ^: F9 ~1 `
  66. <font color="#000000" face="Tahoma" size="3">#if (PAYLOAD_LEN > MAX_APP_BUFFER_SIZE)</font>
    2 i; {/ |5 T: a- w5 |) _- T
  67. <font color="#000000" face="Tahoma" size="3">#error PAYLOAD_LEN must be less or equal than MAX_APP_BUFFER_SIZE</font>8 G/ O/ f1 `' l
  68. <font color="#000000" face="Tahoma" size="3">#endif /* (PAYLOAD_LEN > MAX_APP_BUFFER_SIZE) */</font>
    ; y# C$ A8 _7 X: {
  69. <font color="#000000" face="Tahoma" size="3">/* wait for remote to be in Rx, before sending a Tx frame*/</font>
    . m0 P, \8 e. ?# I8 ?8 `! q: P
  70. <font color="#000000" face="Tahoma" size="3">#define RX_TIME_MARGIN                200</font>
    ) V% B% r! L( b, ~$ h
  71. <font color="#000000" face="Tahoma" size="3">/* Afc bandwidth in Hz */</font>
    , Q0 Z% S( f7 q( ]" A
  72. <font color="#000000" face="Tahoma" size="3">#define FSK_AFC_BANDWIDTH             83333</font>
    & O1 H/ z  X8 D9 g% P5 ]
  73. <font color="#000000" face="Tahoma" size="3">/* LED blink Period*/</font>
    * Z1 Y+ p- Z1 R7 e2 {: v  V( _2 J
  74. <font color="#000000" face="Tahoma" size="3">#define LED_PERIOD_MS                 200</font>6 z; M5 a7 r/ M( x" @2 r0 ]2 T3 f
  75. <font color="#000000" face="Tahoma" size="3">/* USER CODE END PD */</font>
    $ ?! Z: d; ?( A, r
  76. / r( O* }; \$ j  j3 u% d
  77. <font color="#000000" face="Tahoma" size="3">/* Private macro -------------------------------------------------------------*/</font>$ B# H# c4 O2 a* `2 H6 ^
  78. <font color="#000000" face="Tahoma" size="3">/* USER CODE BEGIN PM */</font>
    ! j( s' R5 c1 c# H% X# K; [8 j

  79. ) Z, ?6 _/ W- O. {, K
  80. <font color="#000000" face="Tahoma" size="3">/* USER CODE END PM */</font>
    : {0 q8 D- m# [, n4 c* w

  81. 3 X6 ]; I/ g, i- N6 W, S0 c9 I
  82. <font color="#000000" face="Tahoma" size="3">/* Private variables ---------------------------------------------------------*/</font>
    . e. @  i) Q, h4 s' J, o. V# Y
  83. <font color="#000000" face="Tahoma" size="3">/* Radio events function pointer */</font>
    0 f% l# T& v! _7 [- C
  84. <font color="#000000" face="Tahoma" size="3">static RadioEvents_t RadioEvents;</font>, a% t" X+ E% g2 o6 R2 ~
  85. <font color="#000000" face="Tahoma" size="3">/* USER CODE BEGIN PV */</font>
    8 K; n, x8 q5 R4 F
  86. <font color="#000000" face="Tahoma" size="3">/*Ping Pong FSM states */</font>6 C1 `! Y0 X! W2 j8 k5 X! k
  87. <font color="#000000" face="Tahoma" size="3">static States_t State = RX;</font>
    0 Q/ q8 T9 h, v" j
  88. <font color="#000000" face="Tahoma" size="3">/* App Rx Buffer*/</font>
    * J+ u- U( \7 Z/ ?% E. v
  89. <font color="#000000" face="Tahoma" size="3">static uint8_t BufferRx[MAX_APP_BUFFER_SIZE];</font>
    4 T- X6 ?2 l/ d+ S# l; q
  90. <font color="#000000" face="Tahoma" size="3">/* App Tx Buffer*/</font>6 h8 a5 u- i5 l% X' w- P4 W# B8 o1 _
  91. <font color="#000000" face="Tahoma" size="3">static uint8_t BufferTx[MAX_APP_BUFFER_SIZE];</font>0 s; G3 V& S! b( t, @0 J
  92. <font color="#000000" face="Tahoma" size="3">/* Last  Received Buffer Size*/</font>
    6 H9 ]1 v/ @" Q$ l8 \( [! T
  93. <font color="#000000" face="Tahoma" size="3">uint16_t RxBufferSize = 0;</font>
    - Z. `7 p  t3 w6 f1 f- n: l0 @/ m  j
  94. <font color="#000000" face="Tahoma" size="3">/* Last  Received packer Rssi*/</font>: S8 j# T) ^8 A; j
  95. <font color="#000000" face="Tahoma" size="3">int8_t RssiValue = 0;</font>6 m% }$ l3 R: K, o" ~8 h
  96. <font color="#000000" face="Tahoma" size="3">/* Last  Received packer SNR (in Lora modulation)*/</font>
    3 k8 L, U7 {- S
  97. <font color="#000000" face="Tahoma" size="3">int8_t SnrValue = 0;</font>
    + I+ G: K$ T) {  |
  98. <font color="#000000" face="Tahoma" size="3">/* Led Timers objects*/</font>& n' a" C3 E+ D/ K% S- r) h
  99. <font color="#000000" face="Tahoma" size="3">static UTIL_TIMER_Object_t timerLed;</font>" M1 R- Y1 M* Z8 s) ]9 U
  100. <font color="#000000" face="Tahoma" size="3">/* device state. Master: true, Slave: false*/</font>3 Q' {' y9 h7 ^0 ]
  101. <font color="#000000" face="Tahoma" size="3">bool isMaster = true;</font>' J- z) q! O3 u6 T6 \1 T
  102. <font color="#000000" face="Tahoma" size="3">/* random delay to make sure 2 devices will sync*/</font>
      c8 Z# d  S% J" n4 Q5 a
  103. <font color="#000000" face="Tahoma" size="3">/* the closest the random delays are, the longer it will</font>8 M0 P- I$ v% m$ |
  104. <font color="#000000" face="Tahoma" size="3">   take for the devices to sync when started simultaneously*/</font>& A2 ?1 z: y3 T5 m, U
  105. <font color="#000000" face="Tahoma" size="3">static int32_t random_delay;</font>
    1 o4 x( Q' _$ @1 x2 E/ n( H
  106. <font color="#000000" face="Tahoma" size="3">/* USER CODE END PV */</font>
    * m" @& {/ |1 Q+ I
  107. " r6 `9 f: {/ D; y# h, w; b
  108. <font color="#000000" face="Tahoma" size="3">/* Private function prototypes -----------------------------------------------*/</font>- l" B+ B% K$ K$ ~4 v
  109. <font color="#000000" face="Tahoma" size="3">/*!</font>6 @4 x. Q+ r  l# C' B6 p
  110. <font color="#000000" face="Tahoma" size="3"> * @brief Function to be executed on Radio Tx Done event</font>6 X7 N! |- V) p( C# V, }/ T! D1 O
  111. <font color="#000000" face="Tahoma" size="3"> */</font>, M' g. O, E1 q. H
  112. <font color="#000000" face="Tahoma" size="3">static void OnTxDone(void);</font>
    9 e/ e8 h6 O, z6 Y/ i
  113. # d% H3 b. N/ H
  114. <font color="#000000" face="Tahoma" size="3">/**</font>
    & q: S& n* R/ d, g0 J
  115. <font color="#000000" face="Tahoma" size="3">  * @brief Function to be executed on Radio Rx Done event</font>+ f8 [: o) M5 g0 @- F4 E
  116. <font color="#000000" face="Tahoma" size="3">  * @param  payload ptr of buffer received</font>
    $ b8 P! g( q, ?' e/ p* |
  117. <font color="#000000" face="Tahoma" size="3">  * @param  size buffer size</font>; l0 I; i: x% ^' n, R
  118. <font color="#000000" face="Tahoma" size="3">  * @param  rssi</font>  i8 w1 E* @6 c1 Q  M2 b
  119. <font color="#000000" face="Tahoma" size="3">  * @param  LoraSnr_FskCfo</font>
    5 Z. w0 P: V& Y2 n  @1 j
  120. <font color="#000000" face="Tahoma" size="3">  */</font>) ]: n( v8 i: u2 _  Z$ S8 l
  121. <font color="#000000" face="Tahoma" size="3">static void OnRxDone(uint8_t *payload, uint16_t size, int16_t rssi, int8_t LoraSnr_FskCfo);</font>: b2 c+ Z% X' \: M. p2 f! v  v2 j/ k
  122. 8 d' E$ C* i, \- A
  123. <font color="#000000" face="Tahoma" size="3">/**</font>
    , l/ N4 o) D0 t& ]
  124. <font color="#000000" face="Tahoma" size="3">  * @brief Function executed on Radio Tx Timeout event</font>
    * D% H) w/ L- N9 H4 z. A
  125. <font color="#000000" face="Tahoma" size="3">  */</font>
    * w# v2 g8 I1 _* Q: V
  126. <font color="#000000" face="Tahoma" size="3">static void OnTxTimeout(void);</font>
      e1 G$ ]3 x9 H. W  c8 C# `
  127. & [# B: Y: ^- J5 l( k4 J
  128. <font color="#000000" face="Tahoma" size="3">/**</font>1 `( W% S+ s, G1 N5 `  n% k) o% B
  129. <font color="#000000" face="Tahoma" size="3">  * @brief Function executed on Radio Rx Timeout event</font>
    - I1 j! E4 q8 x& p$ W/ ?) i6 K
  130. <font color="#000000" face="Tahoma" size="3">  */</font>" k$ Q# G$ q/ w
  131. <font color="#000000" face="Tahoma" size="3">static void OnRxTimeout(void);</font>
    5 T4 `- S: Z+ P; f% Y! x. s- G' B* r
  132. 7 T) B) b# R1 W' C1 C2 C
  133. <font color="#000000" face="Tahoma" size="3">/**</font>
    $ p! V' O. \5 F0 x4 y
  134. <font color="#000000" face="Tahoma" size="3">  * @brief Function executed on Radio Rx Error event</font>; B/ H$ w7 W1 {, k4 F+ |$ |8 }
  135. <font color="#000000" face="Tahoma" size="3">  */</font>! w6 X- z5 [2 j' q% k
  136. <font color="#000000" face="Tahoma" size="3">static void OnRxError(void);</font>% q, v2 Y, n: Y4 G* l1 a( A! J$ y

  137. # [) S* A) X. {  Q+ S+ o
  138. <font color="#000000" face="Tahoma" size="3">/* USER CODE BEGIN PFP */</font>! o5 H; h: Y7 R" J' t7 K2 ?
  139. <font color="#000000" face="Tahoma" size="3">/**</font>8 d. P# }1 N) l9 C" O& e1 v+ g/ v- k
  140. <font color="#000000" face="Tahoma" size="3">  * @brief  Function executed on when led timer elapses</font>7 I2 D' S( R; X
  141. <font color="#000000" face="Tahoma" size="3">  * @param  context ptr of LED context</font>
    " Z7 _% W6 ~5 G/ |7 L# g3 a
  142. <font color="#000000" face="Tahoma" size="3">  */</font>
    : q+ _( X+ b7 |
  143. <font color="#000000" face="Tahoma" size="3">static void OnledEvent(void *context);</font>; O  \. y8 }1 g

  144. 8 x3 r: O" h' l+ ]$ j
  145. <font color="#000000" face="Tahoma" size="3">/**</font>" o  G+ Q% n2 P
  146. <font color="#000000" face="Tahoma" size="3">  * @brief PingPong state machine implementation</font>
    $ {( K% ~- A+ `& `0 c  H, C) _; n
  147. <font color="#000000" face="Tahoma" size="3">  */</font>
      I1 k6 L) u" Z
  148. <font color="#000000" face="Tahoma" size="3">static void PingPong_Process(void);</font>
    % b9 w2 _5 ^8 ?
  149. <font color="#000000" face="Tahoma" size="3">/* USER CODE END PFP */</font>
    + x2 @  l  ^( l1 V( E3 X

  150. # h4 J: F2 ]  V1 h! N" C# Q% J
  151. <font color="#000000" face="Tahoma" size="3">/* Exported functions ---------------------------------------------------------*/</font>" ^0 p2 ?% m1 N0 Z. e
  152. <font color="#000000" face="Tahoma" size="3">void SubghzApp_Init(void)</font>
    5 q1 f. \% U6 m: \  J
  153. <font color="#000000" face="Tahoma" size="3">{</font>' H: C, P4 c* q' C' x7 V
  154. <font color="#000000" face="Tahoma" size="3">  /* USER CODE BEGIN SubghzApp_Init_1 */</font>4 P3 g& j4 V. F5 s$ H, }6 x5 g* f
  155. <font color="#000000" face="Tahoma" size="3">  APP_LOG(TS_OFF, VLEVEL_M, "\n\rPING PONG\n\r");</font>" J: y3 ?' Q  T7 m" n, g2 O6 O
  156. <font color="#000000" face="Tahoma" size="3">  /* Get SubGHY_Phy APP version*/</font>$ S' U/ G8 I, A" \
  157. <font color="#000000" face="Tahoma" size="3">  APP_LOG(TS_OFF, VLEVEL_M, "APPLICATION_VERSION: V%X.%X.%X\r\n",</font>
    4 v. g# i# U& S, _( |+ e
  158. <font color="#000000" face="Tahoma" size="3">          (uint8_t)(APP_VERSION_MAIN),</font>9 c! @7 q9 T- U: T$ @, ?5 \" Q
  159. <font color="#000000" face="Tahoma" size="3">          (uint8_t)(APP_VERSION_SUB1),</font>
    4 J( i4 W" \  b% f0 H+ d
  160. <font color="#000000" face="Tahoma" size="3">          (uint8_t)(APP_VERSION_SUB2));</font>
    - b& a6 \" U( |% t+ i' u) W3 L% ~, K

  161. ) m  z% x0 G3 `9 T
  162. <font color="#000000" face="Tahoma" size="3">  /* Get MW SubGhz_Phy info */</font>
    : W) G# `) E- d7 r1 w# [
  163. <font color="#000000" face="Tahoma" size="3">  APP_LOG(TS_OFF, VLEVEL_M, "MW_RADIO_VERSION:    V%X.%X.%X\r\n",</font>; s9 o. U; H- @: j# e# p) z
  164. <font color="#000000" face="Tahoma" size="3">          (uint8_t)(SUBGHZ_PHY_VERSION_MAIN),</font>6 S  [) b$ a5 \% X( _
  165. <font color="#000000" face="Tahoma" size="3">          (uint8_t)(SUBGHZ_PHY_VERSION_SUB1),</font>
    - B; `- ]6 `* I4 t- _! T
  166. <font color="#000000" face="Tahoma" size="3">          (uint8_t)(SUBGHZ_PHY_VERSION_SUB2));</font>
    ) Y) F9 Y. _  W5 l3 R% O
  167. + ^% V+ ~6 Y+ K
  168. <font color="#000000" face="Tahoma" size="3">  /* Led Timers*/</font>
    0 Y) g. s7 \$ o/ Z3 Y. s
  169. <font color="#000000" face="Tahoma" size="3">  UTIL_TIMER_Create(&timerLed, LED_PERIOD_MS, UTIL_TIMER_ONESHOT, OnledEvent, NULL);</font>( y: }. x1 f) c0 E& ~: O7 n
  170. <font color="#000000" face="Tahoma" size="3">  UTIL_TIMER_Start(&timerLed);</font>
    ; M7 R6 {* E$ h: w# R
  171. <font color="#000000" face="Tahoma" size="3">  /* USER CODE END SubghzApp_Init_1 */</font>+ n) ?* F  a% s( t, x2 r: V
  172. - @8 ~3 ^3 M! H+ J  [9 R
  173. <font color="#000000" face="Tahoma" size="3">  /* Radio initialization */</font>: q" f( L) a, B2 w& E9 l% g
  174. <font color="#000000" face="Tahoma" size="3">  RadioEvents.TxDone = OnTxDone;</font>
    ; P1 m, o. {7 X7 P- R$ m+ E
  175. <font color="#000000" face="Tahoma" size="3">  RadioEvents.RxDone = OnRxDone;</font>& b% Z7 z/ a# ^: U$ q' q  S
  176. <font color="#000000" face="Tahoma" size="3">  RadioEvents.TxTimeout = OnTxTimeout;</font>$ q- m1 T/ ^$ Y' D
  177. <font color="#000000" face="Tahoma" size="3">  RadioEvents.RxTimeout = OnRxTimeout;</font>
    - d! P) e" m* ^5 M& e; h
  178. <font color="#000000" face="Tahoma" size="3">  RadioEvents.RxError = OnRxError;</font>
    , A6 y3 s. V; K0 M
  179. 4 I; E0 W. V# f* Y3 g4 ~
  180. <font color="#000000" face="Tahoma" size="3">  Radio.Init(&RadioEvents);</font>, a2 M1 X, z% P: A2 H. u
  181. 0 R  ]/ n+ z  ?
  182. <font color="#000000" face="Tahoma" size="3">  /* USER CODE BEGIN SubghzApp_Init_2 */</font>+ l7 V3 U' C0 m, {
  183. <font color="#000000" face="Tahoma" size="3">/*calculate random delay for synchronization*/</font>
    6 y  b( k$ ?! K. o0 q' J# m
  184. <font color="#000000" face="Tahoma" size="3">  random_delay = (Radio.Random()) >> 22; /*10bits random e.g. from 0 to 1023 ms*/</font>
    * g" |0 z" E, Q. @6 L. v3 _. {

  185. 4 u+ d, O5 n1 |  `* W8 ~8 G
  186. <font color="#000000" face="Tahoma" size="3">  /* Radio Set frequency */</font>* s7 T  a( ^6 V. `1 N" x/ w- Q  E
  187. <font color="#000000" face="Tahoma" size="3">  Radio.SetChannel(RF_FREQUENCY);</font>
    . a6 p# U2 S1 P' u& Z

  188. . c5 s* C7 _0 N3 w% `5 s
  189. <font color="#000000" face="Tahoma" size="3">  /* Radio configuration */</font>$ T( h. I  j4 x2 G
  190. <font color="#000000" face="Tahoma" size="3">#if ((USE_MODEM_LORA == 1) && (USE_MODEM_FSK == 0))</font>' ?, S: S6 }3 m2 V: M3 a3 m
  191. <font color="#000000" face="Tahoma" size="3">  APP_LOG(TS_OFF, VLEVEL_M, "---------------\n\r");</font>0 g( h8 y" ^; m5 a- C9 b
  192. <font color="#000000" face="Tahoma" size="3">  APP_LOG(TS_OFF, VLEVEL_M, "LORA_MODULATION\n\r");</font>6 @" \/ s9 |2 Z7 ^
  193. <font color="#000000" face="Tahoma" size="3">  APP_LOG(TS_OFF, VLEVEL_M, "LORA_BW=%d kHz\n\r", (1 << LORA_BANDWIDTH) * 125);</font>
    , ~9 |8 s- |% q0 {8 Z
  194. <font color="#000000" face="Tahoma" size="3">  APP_LOG(TS_OFF, VLEVEL_M, "LORA_SF=%d\n\r", LORA_SPREADING_FACTOR);</font>: ^& T0 x; y3 Q! d% X  n
  195. $ }6 T  A% |0 _( ^
  196. <font color="#000000" face="Tahoma" size="3">  Radio.SetTxConfig(MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH,</font>
    - H8 d' o" f2 I) k
  197. <font color="#000000" face="Tahoma" size="3">                    LORA_SPREADING_FACTOR, LORA_CODINGRATE,</font>
    , ]% k2 \5 Q1 j- \9 G& M
  198. <font color="#000000" face="Tahoma" size="3">                    LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON,</font>
    1 D$ Y" r: e7 E; y$ @% u" a% X
  199. <font color="#000000" face="Tahoma" size="3">                    true, 0, 0, LORA_IQ_INVERSION_ON, TX_TIMEOUT_VALUE);</font>
      u0 U$ Y- T$ c8 M+ o
  200. + L, I/ f2 F3 T% g; V4 X3 [; B
  201. <font color="#000000" face="Tahoma" size="3">  Radio.SetRxConfig(MODEM_LORA, LORA_BANDWIDTH, LORA_SPREADING_FACTOR,</font>
    + J0 s3 V6 u+ j9 L7 T5 X  `9 [
  202. <font color="#000000" face="Tahoma" size="3">                    LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH,</font>% F: M: P" q3 B2 \  e/ T
  203. <font color="#000000" face="Tahoma" size="3">                    LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON,</font>3 x) t3 K8 B' n8 F- x
  204. <font color="#000000" face="Tahoma" size="3">                    0, true, 0, 0, LORA_IQ_INVERSION_ON, true);</font>, V' [" e8 ]+ N5 ]0 S

  205. . z; ?5 X0 Y, g! D
  206. <font color="#000000" face="Tahoma" size="3">  Radio.SetMaxPayloadLength(MODEM_LORA, MAX_APP_BUFFER_SIZE);</font>$ t4 T7 a7 d# M% v0 a# `

  207. 7 K9 R! ?5 @+ z. n9 C1 T; p% A
  208. <font color="#000000" face="Tahoma" size="3">#elif ((USE_MODEM_LORA == 0) && (USE_MODEM_FSK == 1))</font>( m$ N, `  R! F9 B2 _- m0 [( E9 f
  209. <font color="#000000" face="Tahoma" size="3">  APP_LOG(TS_OFF, VLEVEL_M, "---------------\n\r");</font>
    8 }3 `1 r: M: W% Z/ }3 O7 K* L
  210. <font color="#000000" face="Tahoma" size="3">  APP_LOG(TS_OFF, VLEVEL_M, "FSK_MODULATION\n\r");</font>  N8 ~4 W- R, A7 [
  211. <font color="#000000" face="Tahoma" size="3">  APP_LOG(TS_OFF, VLEVEL_M, "FSK_BW=%d Hz\n\r", FSK_BANDWIDTH);</font>
    " v9 I! j! ?4 z- O
  212. <font color="#000000" face="Tahoma" size="3">  APP_LOG(TS_OFF, VLEVEL_M, "FSK_DR=%d bits/s\n\r", FSK_DATARATE);</font>
    . \) Z4 s  F6 ]4 _3 e5 Z
  213. ! h' W1 v: V4 X4 K0 {$ h
  214. <font color="#000000" face="Tahoma" size="3">  Radio.SetTxConfig(MODEM_FSK, TX_OUTPUT_POWER, FSK_FDEV, 0,</font>
    2 Y. J/ y9 E5 V$ i
  215. <font color="#000000" face="Tahoma" size="3">                    FSK_DATARATE, 0,</font>1 z( _" E  F# e$ ~% i# t
  216. <font color="#000000" face="Tahoma" size="3">                    FSK_PREAMBLE_LENGTH, FSK_FIX_LENGTH_PAYLOAD_ON,</font>: S5 J, ^) L1 h3 H
  217. <font color="#000000" face="Tahoma" size="3">                    true, 0, 0, 0, TX_TIMEOUT_VALUE);</font>
    ; s8 D. H  J4 `$ k  p

  218. + Z0 x* X, B, i) K3 s8 [4 q, p- U
  219. <font color="#000000" face="Tahoma" size="3">  Radio.SetRxConfig(MODEM_FSK, FSK_BANDWIDTH, FSK_DATARATE,</font>! i% Q: X/ b+ W. P4 b; l
  220. <font color="#000000" face="Tahoma" size="3">                    0, FSK_AFC_BANDWIDTH, FSK_PREAMBLE_LENGTH,</font>" o& W9 r& y* E: x1 F: T. _$ \
  221. <font color="#000000" face="Tahoma" size="3">                    0, FSK_FIX_LENGTH_PAYLOAD_ON, 0, true,</font>* h( Y. Z; j: i9 Y& p
  222. <font color="#000000" face="Tahoma" size="3">                    0, 0, false, true);</font>
      P8 Z+ m( x6 U

  223. 8 F7 c" A" k! F1 |8 r4 R' C! E
  224. <font color="#000000" face="Tahoma" size="3">  Radio.SetMaxPayloadLength(MODEM_FSK, MAX_APP_BUFFER_SIZE);</font>
    3 ?. P  z: l: z* |  Q

  225. " C7 Y# j  h, @) q+ _
  226. <font color="#000000" face="Tahoma" size="3">#else</font>2 R$ K4 [. ?3 u$ S
  227. <font color="#000000" face="Tahoma" size="3">#error "Please define a modulation in the subghz_phy_app.h file."</font>
    2 Z( o" W: h! N9 S$ x( y
  228. <font color="#000000" face="Tahoma" size="3">#endif /* USE_MODEM_LORA | USE_MODEM_FSK */</font>
    # }& O  o; r2 J. M1 F
  229. 3 R& t2 M+ h! A/ t
  230. <font color="#000000" face="Tahoma" size="3">  /*fills tx buffer*/</font>- N3 y3 A0 F5 g; D# h3 T+ D9 c
  231. <font color="#000000" face="Tahoma" size="3">  memset(BufferTx, 0x0, MAX_APP_BUFFER_SIZE);</font>! b7 D/ f+ ~& A4 n1 \+ Z1 P4 N5 y, N' W

  232. ) y+ p- F2 X# g, s8 k0 K% ^
  233. <font color="#000000" face="Tahoma" size="3">  APP_LOG(TS_ON, VLEVEL_L, "rand=%d\n\r", random_delay);</font>
    7 Z  P$ a- m; z
  234. <font color="#000000" face="Tahoma" size="3">  /*starts reception*/</font>
    7 f( M- D+ D) J$ S5 Q0 ]6 i
  235. <font color="#000000" face="Tahoma" size="3">  Radio.Rx(RX_TIMEOUT_VALUE + random_delay);</font>8 H8 q+ |: k% l6 k: t; v
  236. : U: r8 \$ O, u/ s0 x- E0 D
  237. <font color="#000000" face="Tahoma" size="3">  /*register task to to be run in while(1) after Radio IT*/</font>
    + U; R5 X, R( a3 [# W9 z# T
  238. <font color="#000000" face="Tahoma" size="3">  UTIL_SEQ_RegTask((1 << CFG_SEQ_Task_SubGHz_Phy_App_Process), UTIL_SEQ_RFU, PingPong_Process);</font>
    0 K" V2 A* g# B% A1 P, [
  239. <font color="#000000" face="Tahoma" size="3">  /* USER CODE END SubghzApp_Init_2 */</font>0 q, l& Y9 {0 _5 e. X- N/ [
  240. <font color="#000000" face="Tahoma" size="3">}</font>' P& I8 F  P' r8 n

  241. % P0 S; l- p/ v4 P! @8 {" D/ {
  242. <font color="#000000" face="Tahoma" size="3">/* USER CODE BEGIN EF */</font>
    2 {( |& f0 x2 t

  243. 8 i7 }) x& F4 t- t5 _5 A
  244. <font color="#000000" face="Tahoma" size="3">/* USER CODE END EF */</font>6 M6 q6 O8 ?  d7 @, s( C5 c
  245. 4 p! Y+ f6 i) i; f0 k1 E! F
  246. <font color="#000000" face="Tahoma" size="3">/* Private functions ---------------------------------------------------------*/</font>
    - k6 \+ r: z/ M8 c7 f! E+ l
  247. <font color="#000000" face="Tahoma" size="3">static void OnTxDone(void)</font>
    ; F7 Q& N: {* e8 P+ b4 i
  248. <font color="#000000" face="Tahoma" size="3">{</font>) Z# ?* y8 y7 Q2 R# W
  249. <font color="#000000" face="Tahoma" size="3">  /* USER CODE BEGIN OnTxDone */</font>- |  v0 l; d6 q( `( y
  250. <font color="#000000" face="Tahoma" size="3">        APP_LOG(TS_ON, VLEVEL_L, "OnTxDone\n\r");</font>% C% b% m! n: O/ y) Y
  251. <font color="#000000" face="Tahoma" size="3">  /* Update the State of the FSM*/</font>0 _1 u: a2 d: q- \8 L$ {! c5 ^
  252. <font color="#000000" face="Tahoma" size="3">  State = TX;</font>% F% \: M/ L. P6 O! W0 j
  253. <font color="#000000" face="Tahoma" size="3">  /* Run PingPong process in background*/</font>
    - j: o# e/ R  P# B
  254. <font color="#000000" face="Tahoma" size="3">  UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_SubGHz_Phy_App_Process), CFG_SEQ_Prio_0);</font>
    3 `+ y- K; J2 x' v* t: W$ q
  255. <font color="#000000" face="Tahoma" size="3">  /* USER CODE END OnTxDone */</font>4 L* \& l+ c! |0 i- ~$ S; h
  256. <font color="#000000" face="Tahoma" size="3">}</font>  F' A# w* F% R& O  O

  257. ( S# d7 K+ L- k" M: u/ o
  258. <font color="#000000" face="Tahoma" size="3">static void OnRxDone(uint8_t *payload, uint16_t size, int16_t rssi, int8_t LoraSnr_FskCfo)</font>
    7 P7 D3 e2 T" e6 ?6 _) ~; {9 v
  259. <font color="#000000" face="Tahoma" size="3">{</font>
    1 l6 g- }9 ]  s0 f% I& E
  260. <font color="#000000" face="Tahoma" size="3">  /* USER CODE BEGIN OnRxDone */</font>! P5 h! R3 v! v! _: z, D" A
  261. <font color="#000000" face="Tahoma" size="3">        APP_LOG(TS_ON, VLEVEL_L, "OnRxDone\n\r");</font>
    . m. F2 V! M/ K" J/ r' W& s. F7 E5 V
  262. <font color="#000000" face="Tahoma" size="3">#if ((USE_MODEM_LORA == 1) && (USE_MODEM_FSK == 0))</font>
    , N* n: e* b6 z$ H: }# M
  263. <font color="#000000" face="Tahoma" size="3">  APP_LOG(TS_ON, VLEVEL_L, "RssiValue=%d dBm, SnrValue=%ddB\n\r", rssi, LoraSnr_FskCfo);</font>& m( ^  [- i0 T1 N3 x9 a
  264. <font color="#000000" face="Tahoma" size="3">  /* Record payload Signal to noise ratio in Lora*/</font>
    3 J& i+ a+ P4 a3 y, M
  265. <font color="#000000" face="Tahoma" size="3">  SnrValue = LoraSnr_FskCfo;</font>9 B  }( |% l1 v0 M# k# e6 e* [
  266. <font color="#000000" face="Tahoma" size="3">#endif /* USE_MODEM_LORA | USE_MODEM_FSK */</font>0 D  }1 ^  q2 ]7 B  v
  267. <font color="#000000" face="Tahoma" size="3">#if ((USE_MODEM_LORA == 0) && (USE_MODEM_FSK == 1))</font>
    # D- s/ |* Z- j% C; T
  268. <font color="#000000" face="Tahoma" size="3">  APP_LOG(TS_ON, VLEVEL_L, "RssiValue=%d dBm, Cfo=%dkHz\n\r", rssi, LoraSnr_FskCfo);</font>" m6 B  z. |2 n; j( n
  269. <font color="#000000" face="Tahoma" size="3">  SnrValue = 0; /*not applicable in GFSK*/</font>
    ) D* c( d  u# k# ^
  270. <font color="#000000" face="Tahoma" size="3">#endif /* USE_MODEM_LORA | USE_MODEM_FSK */</font>! C5 G1 k/ @8 V$ i) h
  271. <font color="#000000" face="Tahoma" size="3">  /* Update the State of the FSM*/</font>3 h9 D! G6 V% A2 {6 ]6 o
  272. <font color="#000000" face="Tahoma" size="3">  State = RX;</font>: [. X: C3 [# G* G& D
  273. <font color="#000000" face="Tahoma" size="3">  /* Clear BufferRx*/</font>. S0 L2 q/ S* l
  274. <font color="#000000" face="Tahoma" size="3">  memset(BufferRx, 0, MAX_APP_BUFFER_SIZE);</font>
    % w1 `6 t0 {2 A# Z0 n( Z
  275. <font color="#000000" face="Tahoma" size="3">  /* Record payload size*/</font>! L' v- l: S( f& _5 y
  276. <font color="#000000" face="Tahoma" size="3">  RxBufferSize = size;</font>
      w6 @8 p5 l: I# A) n2 R- G
  277. <font color="#000000" face="Tahoma" size="3">  if (RxBufferSize <= MAX_APP_BUFFER_SIZE)</font>
    . x5 k6 w& i8 i7 V9 {+ H
  278. <font color="#000000" face="Tahoma" size="3">  {</font>
    5 x4 \- }9 R( A2 I7 p
  279. <font color="#000000" face="Tahoma" size="3">    memcpy(BufferRx, payload, RxBufferSize);</font>7 N6 O: n9 N( t/ D; c( v7 c
  280. <font color="#000000" face="Tahoma" size="3">  }</font>9 J5 j. `* H8 {5 w
  281. <font color="#000000" face="Tahoma" size="3">  /* Record Received Signal Strength*/</font>1 i. `7 a+ t8 ^3 o% |
  282. <font color="#000000" face="Tahoma" size="3">  RssiValue = rssi;</font>
    9 L; C6 @8 I4 M* i) j- n. C
  283. <font color="#000000" face="Tahoma" size="3">  /* Record payload content*/</font>
    " s$ K3 b$ o  h( G! U# X
  284. <font color="#000000" face="Tahoma" size="3">  APP_LOG(TS_ON, VLEVEL_H, "payload. size=%d \n\r", size);</font>5 A- ]9 j! ~) O4 B& _* L
  285. <font color="#000000" face="Tahoma" size="3">  for (int i = 0; i < PAYLOAD_LEN; i++)</font>5 O# m( c6 R! m2 h* o! w' `* b
  286. <font color="#000000" face="Tahoma" size="3">  {</font>: x7 f+ S1 _+ K+ |
  287. <font color="#000000" face="Tahoma" size="3">    APP_LOG(TS_OFF, VLEVEL_H, "%02X", BufferRx);</font>
    4 K$ z  u; W) K5 ]
  288. <font color="#000000" face="Tahoma" size="3">    if (i % 16 == 15)</font>
    6 S( P8 E3 Z5 \# l
  289. <font color="#000000" face="Tahoma" size="3">    {</font>  ~. m, K( P" x) [6 B8 o
  290. <font color="#000000" face="Tahoma" size="3">      APP_LOG(TS_OFF, VLEVEL_H, "\n\r");</font>  r7 [/ c/ G* C* }
  291. <font color="#000000" face="Tahoma" size="3">    }</font>
    ; _/ \  ]& x8 i) M- a# X
  292. <font color="#000000" face="Tahoma" size="3">  }</font>. z4 Q4 |- e5 T" R* |/ {$ G2 C
  293. <font color="#000000" face="Tahoma" size="3">  APP_LOG(TS_OFF, VLEVEL_H, "\n\r");</font>
    % [6 |. k2 s9 g7 @) Z8 ?  @; S
  294. <font color="#000000" face="Tahoma" size="3">  /* Run PingPong process in background*/</font>
    6 F1 k; j2 O8 z, [
  295. <font color="#000000" face="Tahoma" size="3">  UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_SubGHz_Phy_App_Process), CFG_SEQ_Prio_0);</font>6 g5 |7 G0 V2 I. c
  296. <font color="#000000" face="Tahoma" size="3">  /* USER CODE END OnRxDone */</font>
    ' s  c# E! E5 t8 Z" ^/ w
  297. <font color="#000000" face="Tahoma" size="3">}</font>
    4 [/ b( u% i6 D3 v% P4 b+ L
  298. $ ~/ @6 X$ Q+ f1 J
  299. <font color="#000000" face="Tahoma" size="3">static void OnTxTimeout(void)</font>5 v- \; C, I! M9 j) D1 Y( H
  300. <font color="#000000" face="Tahoma" size="3">{</font>
    0 l4 O  L2 n7 y' E! K/ u5 n0 O
  301. <font color="#000000" face="Tahoma" size="3">  /* USER CODE BEGIN OnTxTimeout */</font>& u7 ^6 P. H3 z, @& u
  302. <font color="#000000" face="Tahoma" size="3">        APP_LOG(TS_ON, VLEVEL_L, "OnTxTimeout\n\r");</font>
    # k5 u. A" S" j5 S" d% ?
  303. <font color="#000000" face="Tahoma" size="3">  /* Update the State of the FSM*/</font>
    " d+ @. J, O, L3 N( D0 G" [
  304. <font color="#000000" face="Tahoma" size="3">  State = TX_TIMEOUT;</font>
    3 q6 N7 j! D, V7 Q6 E' F- a3 r- B* e
  305. <font color="#000000" face="Tahoma" size="3">  /* Run PingPong process in background*/</font>
    9 V4 r/ Y$ G: u% F% m
  306. <font color="#000000" face="Tahoma" size="3">  UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_SubGHz_Phy_App_Process), CFG_SEQ_Prio_0);</font>1 k3 w4 X5 r# B3 r/ Y& E
  307. <font color="#000000" face="Tahoma" size="3">  /* USER CODE END OnTxTimeout */</font>: S& J) c6 T6 H5 O2 n/ a5 U
  308. <font color="#000000" face="Tahoma" size="3">}</font>8 E5 j$ w5 w( C3 `5 g3 Q2 l# R

  309. : o6 a8 S4 x/ ^
  310. <font color="#000000" face="Tahoma" size="3">static void OnRxTimeout(void)</font>8 ^. ^% E' z7 K0 K9 e
  311. <font color="#000000" face="Tahoma" size="3">{</font>$ |5 @: I  H* X7 }7 b; O
  312. <font color="#000000" face="Tahoma" size="3">  /* USER CODE BEGIN OnRxTimeout */</font>7 L: Z4 b0 O% a+ u7 u6 H
  313. <font color="#000000" face="Tahoma" size="3">         APP_LOG(TS_ON, VLEVEL_L, "OnRxTimeout\n\r");</font>
    5 B3 l: `- r& \* Y7 }
  314. <font color="#000000" face="Tahoma" size="3">  /* Update the State of the FSM*/</font>( X2 d* ?' n( h
  315. <font color="#000000" face="Tahoma" size="3">  State = RX_TIMEOUT;</font>
    # M( b* Y; K/ ^5 Z: l& }0 i! F
  316. <font color="#000000" face="Tahoma" size="3">  /* Run PingPong process in background*/</font>
    , a$ Q' A3 J$ Y$ E- f" x! O( p+ R
  317. <font color="#000000" face="Tahoma" size="3">  UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_SubGHz_Phy_App_Process), CFG_SEQ_Prio_0);</font>
      z4 u. d/ D  G2 K1 {
  318. <font color="#000000" face="Tahoma" size="3">  /* USER CODE END OnRxTimeout */</font>/ ]- h, X* C! W, E1 I) H
  319. <font color="#000000" face="Tahoma" size="3">}</font>
    ) {" z5 |) i! E7 M2 `
  320. " i: w& t/ |4 r% l3 J; R+ P
  321. <font color="#000000" face="Tahoma" size="3">static void OnRxError(void)</font>/ i  d$ }- @' O2 s; t6 ^
  322. <font color="#000000" face="Tahoma" size="3">{</font>4 W6 A# Q8 J: D9 p
  323. <font color="#000000" face="Tahoma" size="3">  /* USER CODE BEGIN OnRxError */</font>1 ^! m% ~/ u  N+ @% P8 a2 I# O
  324. <font color="#000000" face="Tahoma" size="3">        APP_LOG(TS_ON, VLEVEL_L, "OnRxError\n\r");</font>
    ( U0 d" z5 i) a5 c9 k
  325. <font color="#000000" face="Tahoma" size="3">  /* Update the State of the FSM*/</font>
    9 r* X7 W7 m- L- w
  326. <font color="#000000" face="Tahoma" size="3">  State = RX_ERROR;</font>
    9 O7 ?+ x: S5 K: \6 k* S
  327. <font color="#000000" face="Tahoma" size="3">  /* Run PingPong process in background*/</font>
    5 `& c* K; Q" V; d6 b; o
  328. <font color="#000000" face="Tahoma" size="3">  UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_SubGHz_Phy_App_Process), CFG_SEQ_Prio_0);</font>5 z+ j* ]  y5 T" q# J
  329. <font color="#000000" face="Tahoma" size="3">  /* USER CODE END OnRxError */</font>) G4 I% e2 `* \. o, R
  330. <font color="#000000" face="Tahoma" size="3">}</font>1 L" s# A" \# G& z2 V) E

  331. 6 P. ^3 g2 Y& b5 T- s; S4 l- O
  332. <font color="#000000" face="Tahoma" size="3">/* USER CODE BEGIN PrFD */</font>
      C! s0 R) U+ w4 k/ `) H
  333. <font color="#000000" face="Tahoma" size="3">static void PingPong_Process(void)</font>( e+ r5 i: z' ~5 `. W( o
  334. <font color="#000000" face="Tahoma" size="3">{</font>6 O: j6 ?2 R; X, ^
  335. <font color="#000000" face="Tahoma" size="3">  Radio.Sleep();</font>: @# C5 s# z" g+ m

  336. + ]- ?# z' b/ l" z! _
  337. <font color="#000000" face="Tahoma" size="3">  switch (State)</font>3 S' v+ R$ R. d4 o& j
  338. <font color="#000000" face="Tahoma" size="3">  {</font>4 k- R' c( M0 C% n
  339. <font color="#000000" face="Tahoma" size="3">    case RX:</font>
    $ n" M# Z6 c& C" |7 }
  340. + C. G* e! u7 ^' E( i$ |
  341. <font color="#000000" face="Tahoma" size="3">      if (isMaster == true)</font># c9 {( T% }* R/ j
  342. <font color="#000000" face="Tahoma" size="3">      {</font>5 ?! C* o0 \' i7 n, o; \4 r- T
  343. <font color="#000000" face="Tahoma" size="3">        if (RxBufferSize > 0)</font>. U: F5 P# g5 C. o$ e+ K
  344. <font color="#000000" face="Tahoma" size="3">        {</font>0 s  u) P  M; G) s% e4 @! ?
  345. <font color="#000000" face="Tahoma" size="3">          if (strncmp((const char *)BufferRx, PONG, sizeof(PONG) - 1) == 0)</font>
    ' r2 x0 Y7 v# p# m0 w
  346. <font color="#000000" face="Tahoma" size="3">          {</font>$ m3 }4 Y; |% S0 [
  347. <font color="#000000" face="Tahoma" size="3">            UTIL_TIMER_Stop(&timerLed);</font>2 o2 R9 j& E5 v# E& _
  348. <font color="#000000" face="Tahoma" size="3">            /* switch off green led */</font>; w0 X1 {+ o1 T& l3 [  Q
  349. <font color="#000000" face="Tahoma" size="3">            HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_RESET); /* LED_GREEN */</font>1 [/ s7 o1 [, L  C" A  H
  350. <font color="#000000" face="Tahoma" size="3">            /* master toggles red led */</font>
    / h" x9 Q% G0 Y4 B
  351. <font color="#000000" face="Tahoma" size="3">            HAL_GPIO_TogglePin(LED3_GPIO_Port, LED3_Pin); /* LED_RED */</font>
    7 E1 n2 t1 S) J: l- W
  352. <font color="#000000" face="Tahoma" size="3">            /* Add delay between RX and TX */</font>
    9 Y& _4 a6 \# D( G! u0 M& f2 v
  353. <font color="#000000" face="Tahoma" size="3">            HAL_Delay(Radio.GetWakeupTime() + RX_TIME_MARGIN);</font>, D4 _, Z9 M- O6 q' t8 F% h
  354. <font color="#000000" face="Tahoma" size="3">            /* master sends PING*/</font>
    : i5 [. T/ l0 u& A* L% x1 c
  355. <font color="#000000" face="Tahoma" size="3">            APP_LOG(TS_ON, VLEVEL_L, "..."</font>
    1 u6 p1 G$ Q- I) k& r5 m. _
  356. <font color="#000000" face="Tahoma" size="3">                    "PING"</font>. @( k5 x; ?+ Y3 D- h. {2 S& \1 ^
  357. <font color="#000000" face="Tahoma" size="3">                    "\n\r");</font>
    % F4 W# H' E( z  S: N; F0 D
  358. <font color="#000000" face="Tahoma" size="3">            APP_LOG(TS_ON, VLEVEL_L, "Master Tx start\n\r");</font>
    9 F4 [: _& \& u* L, l
  359. <font color="#000000" face="Tahoma" size="3">            memcpy(BufferTx, PING, sizeof(PING) - 1);</font>$ }; O) M2 \* \8 K: ^) \% W
  360. <font color="#000000" face="Tahoma" size="3">            Radio.Send(BufferTx, PAYLOAD_LEN);</font>( V: s) g0 S% r% Z! R. d6 e3 z; m% G
  361. <font color="#000000" face="Tahoma" size="3">          }</font>
    7 E( \8 G+ D4 X/ d
  362. <font color="#000000" face="Tahoma" size="3">          else if (strncmp((const char *)BufferRx, PING, sizeof(PING) - 1) == 0)</font>
    9 b5 q- j, f0 `2 U4 w
  363. <font color="#000000" face="Tahoma" size="3">          {</font>
    3 W! w( B; S5 ?2 V1 V* J& m8 F% |4 b
  364. <font color="#000000" face="Tahoma" size="3">            /* A master already exists then become a slave */</font>9 _2 R# a+ P% m0 @1 ~) k7 w& `. v$ |
  365. <font color="#000000" face="Tahoma" size="3">            isMaster = false;</font>' u/ ^- {  u" I
  366. <font color="#000000" face="Tahoma" size="3">            APP_LOG(TS_ON, VLEVEL_L, "Slave Rx start\n\r");</font>
    : k, p' s$ k+ J5 x4 L4 y5 t
  367. <font color="#000000" face="Tahoma" size="3">            Radio.Rx(RX_TIMEOUT_VALUE);</font>
    + l2 K4 Y# J, v" T* B3 F+ J0 U- R
  368. <font color="#000000" face="Tahoma" size="3">          }</font>
    $ D4 y3 n( @0 ]" k+ Y
  369. <font color="#000000" face="Tahoma" size="3">          else /* valid reception but neither a PING or a PONG message */</font>
    + [' C, I* _# w3 A+ X% V* ?6 _# K% @
  370. <font color="#000000" face="Tahoma" size="3">          {</font>7 D& Q1 ?/ k2 M# D
  371. <font color="#000000" face="Tahoma" size="3">            /* Set device as master and start again */</font>/ C  N. I1 l. R( j' g4 Y# T5 b- {
  372. <font color="#000000" face="Tahoma" size="3">            isMaster = true;</font>
    5 n' _' l4 K& p6 v; q
  373. <font color="#000000" face="Tahoma" size="3">            APP_LOG(TS_ON, VLEVEL_L, "Master Rx start\n\r");</font>
    # ^4 }( [' i8 ~3 M; u1 Z1 J
  374. <font color="#000000" face="Tahoma" size="3">            Radio.Rx(RX_TIMEOUT_VALUE);</font>
    : R2 F( {% B. |2 h+ R' i
  375. <font color="#000000" face="Tahoma" size="3">          }</font>! G& C% L; {4 ?( I1 V
  376. <font color="#000000" face="Tahoma" size="3">        }</font>
    % U8 D  ^' c0 \# {( N' |* L
  377. <font color="#000000" face="Tahoma" size="3">      }</font>
      E% q1 K6 M. w; p8 f- Z# T' @
  378. <font color="#000000" face="Tahoma" size="3">      else</font>
    3 C+ T( O9 R' a
  379. <font color="#000000" face="Tahoma" size="3">      {</font>: h0 O. L; s5 G7 B6 X$ D
  380. <font color="#000000" face="Tahoma" size="3">        if (RxBufferSize > 0)</font>
    1 Z! `& [9 @# R- x' D/ m
  381. <font color="#000000" face="Tahoma" size="3">        {</font>
    0 `$ }1 f, @! e# D
  382. <font color="#000000" face="Tahoma" size="3">          if (strncmp((const char *)BufferRx, PING, sizeof(PING) - 1) == 0)</font>7 G5 _5 B" U: r4 j3 A4 O/ \$ B. {
  383. <font color="#000000" face="Tahoma" size="3">          {</font>7 k9 }. l2 @" \8 R1 U5 v  C
  384. <font color="#000000" face="Tahoma" size="3">            UTIL_TIMER_Stop(&timerLed);</font>
    & Z; O, a2 X# U, B) }
  385. <font color="#000000" face="Tahoma" size="3">            /* switch off red led */</font>
    ' V# i% f; U% a- F0 y
  386. <font color="#000000" face="Tahoma" size="3">            HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin, GPIO_PIN_RESET); /* LED_RED */</font>
    . X( I" y9 O) ~6 c$ e' @
  387. <font color="#000000" face="Tahoma" size="3">            /* slave toggles green led */</font>! n$ n$ R' |/ b" u- h& O
  388. <font color="#000000" face="Tahoma" size="3">            HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin); /* LED_GREEN */</font>( t( o0 U/ n/ j; z( p9 u
  389. <font color="#000000" face="Tahoma" size="3">            /* Add delay between RX and TX */</font>1 i! ]" B" ^& o6 s" \8 T2 M
  390. <font color="#000000" face="Tahoma" size="3">            HAL_Delay(Radio.GetWakeupTime() + RX_TIME_MARGIN);</font>
    & q4 O. o, B* H- j
  391. <font color="#000000" face="Tahoma" size="3">            /*slave sends PONG*/</font>4 y; a. S; o8 j; P
  392. <font color="#000000" face="Tahoma" size="3">            APP_LOG(TS_ON, VLEVEL_L, "..."</font>9 J% F* W9 D8 o8 W" q! o2 K
  393. <font color="#000000" face="Tahoma" size="3">                    "PONG"</font>. a5 K2 q3 f0 ]% T) l  h
  394. <font color="#000000" face="Tahoma" size="3">                    "\n\r");</font>7 l; n9 m/ A) x' K# c! ^
  395. <font color="#000000" face="Tahoma" size="3">            APP_LOG(TS_ON, VLEVEL_L, "Slave  Tx start\n\r");</font>- k) w! u! I. Z" ^( Q/ g
  396. <font color="#000000" face="Tahoma" size="3">            memcpy(BufferTx, PONG, sizeof(PONG) - 1);</font>
    4 J' L) S3 d2 _) b( {
  397. <font color="#000000" face="Tahoma" size="3">            Radio.Send(BufferTx, PAYLOAD_LEN);</font>* Z( ^- |* ~- s0 }
  398. <font color="#000000" face="Tahoma" size="3">          }</font>- ^% \( T( I+ r* \
  399. <font color="#000000" face="Tahoma" size="3">          else /* valid reception but not a PING as expected */</font>6 r- `) ]4 k7 X+ ^/ r1 ^' k
  400. <font color="#000000" face="Tahoma" size="3">          {</font>
    ( S+ k* V- s4 T2 ^
  401. <font color="#000000" face="Tahoma" size="3">            /* Set device as master and start again */</font>
    / V# c  t" D) e& M' y
  402. <font color="#000000" face="Tahoma" size="3">            isMaster = true;</font>
    7 P/ ~$ j, R& p9 N' a% V1 S: X
  403. <font color="#000000" face="Tahoma" size="3">            APP_LOG(TS_ON, VLEVEL_L, "Master Rx start\n\r");</font>
    9 J! _6 a9 P. W. K0 A: U
  404. <font color="#000000" face="Tahoma" size="3">            Radio.Rx(RX_TIMEOUT_VALUE);</font>
    , a3 K4 H3 _/ g1 o
  405. <font color="#000000" face="Tahoma" size="3">          }</font>
    - H$ A, [* j, {" g0 i/ j8 ]
  406. <font color="#000000" face="Tahoma" size="3">        }</font>
    5 U, R+ j; ^0 W) t
  407. <font color="#000000" face="Tahoma" size="3">      }</font>6 N8 V# r% b7 P& ?
  408. <font color="#000000" face="Tahoma" size="3">      break;</font>
    1 Y. d* s) t" j: z' c
  409. <font color="#000000" face="Tahoma" size="3">    case TX:</font>
    3 v% w7 v/ C" o! L; Z
  410. <font color="#000000" face="Tahoma" size="3">      APP_LOG(TS_ON, VLEVEL_L, "Rx start\n\r");</font>1 ^$ |/ c/ M9 {9 W# E  X+ x3 f
  411. <font color="#000000" face="Tahoma" size="3">      Radio.Rx(RX_TIMEOUT_VALUE);</font>1 ~5 n% i! V. v7 s# V$ O7 w. c. G
  412. <font color="#000000" face="Tahoma" size="3">      break;</font>
    " \* F3 R9 K7 e/ m1 J
  413. <font color="#000000" face="Tahoma" size="3">    case RX_TIMEOUT:</font>5 `5 k0 f: W. d0 u
  414. <font color="#000000" face="Tahoma" size="3">    case RX_ERROR:</font>0 y1 ~8 c! s; e9 n# }7 n9 _
  415. <font color="#000000" face="Tahoma" size="3">      if (isMaster == true)</font>
    5 C9 |6 C3 n# V8 h1 K) r
  416. <font color="#000000" face="Tahoma" size="3">      {</font>
    7 L) o  ]: ?% @' [5 H
  417. <font color="#000000" face="Tahoma" size="3">        /* Send the next PING frame */</font># f% K/ X; x# C; _& X) V- g" B
  418. <font color="#000000" face="Tahoma" size="3">        /* Add delay between RX and TX*/</font>
    $ H" F0 y5 p5 v, A1 _! l
  419. <font color="#000000" face="Tahoma" size="3">        /* add random_delay to force sync between boards after some trials*/</font>
    ! x% F4 H: X: A9 @5 I/ W: z
  420. <font color="#000000" face="Tahoma" size="3">        HAL_Delay(Radio.GetWakeupTime() + RX_TIME_MARGIN + random_delay);</font>! j' f6 r" v: a7 B0 A$ ^  Q! F4 P& r  L
  421. <font color="#000000" face="Tahoma" size="3">        APP_LOG(TS_ON, VLEVEL_L, "Master Tx start\n\r");</font>
    , L& N) `: z6 z
  422. <font color="#000000" face="Tahoma" size="3">        /* master sends PING*/</font>
    1 R9 U* a  ^( \8 R" v8 E
  423. <font color="#000000" face="Tahoma" size="3">        memcpy(BufferTx, PING, sizeof(PING) - 1);</font>
    , @/ s. l* u3 |% G$ e0 b
  424. <font color="#000000" face="Tahoma" size="3">        Radio.Send(BufferTx, PAYLOAD_LEN);</font>, F: ?# \/ W, H3 x' r
  425. <font color="#000000" face="Tahoma" size="3">      }</font>
    / h( ?. d6 S& ?9 ]) b/ L6 b5 x, n
  426. <font color="#000000" face="Tahoma" size="3">      else</font>
    + V8 B/ U- e1 q# m7 z, L
  427. <font color="#000000" face="Tahoma" size="3">      {</font>9 n+ ]/ F( n* L" g2 B0 u' X" W: p
  428. <font color="#000000" face="Tahoma" size="3">        APP_LOG(TS_ON, VLEVEL_L, "Slave Rx start\n\r");</font>
    3 T* Y# x, C+ b; n  B
  429. <font color="#000000" face="Tahoma" size="3">        Radio.Rx(RX_TIMEOUT_VALUE);</font>+ x" j* v1 x3 g
  430. <font color="#000000" face="Tahoma" size="3">      }</font>
    3 u2 r0 S3 c2 l2 ~1 M$ R+ b
  431. <font color="#000000" face="Tahoma" size="3">      break;</font>
    - E# U9 A1 u3 ^' u4 k; A2 H5 }
  432. <font color="#000000" face="Tahoma" size="3">    case TX_TIMEOUT:</font>
    & }+ g0 y, d* x0 R" X+ O
  433. <font color="#000000" face="Tahoma" size="3">      APP_LOG(TS_ON, VLEVEL_L, "Slave Rx start\n\r");</font>
    % R# |- l0 M) K1 v7 L2 K$ B
  434. <font color="#000000" face="Tahoma" size="3">      Radio.Rx(RX_TIMEOUT_VALUE);</font>  M( y" }' o4 c* c; P
  435. <font color="#000000" face="Tahoma" size="3">      break;</font>. w+ z* ~: |1 Z2 h( T3 L
  436. <font color="#000000" face="Tahoma" size="3">    default:</font>; ]. w! o8 d* O! v  S" d: `
  437. <font color="#000000" face="Tahoma" size="3">      break;</font>/ r- Y. B& T/ T0 {) t
  438. <font color="#000000" face="Tahoma" size="3">  }</font>
    . e, [% l0 a. @
  439. <font color="#000000" face="Tahoma" size="3">}</font>
    7 O" R4 s7 k; l7 e

  440. + {/ \3 \% @% w! t, h$ x0 S
  441. <font color="#000000" face="Tahoma" size="3">static void OnledEvent(void *context)</font>
    " h6 p& m' G% C7 X! j- }8 r
  442. <font color="#000000" face="Tahoma" size="3">{</font>
    ( x& \2 J: t7 x4 a8 w, O
  443. <font color="#000000" face="Tahoma" size="3">  HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin); /* LED_GREEN */</font>
    $ E9 Q  O, R5 C( x
  444. <font color="#000000" face="Tahoma" size="3">  HAL_GPIO_TogglePin(LED3_GPIO_Port, LED3_Pin); /* LED_RED */</font>9 _5 A/ H$ x7 ^( W: z) J# C
  445. <font color="#000000" face="Tahoma" size="3">  UTIL_TIMER_Start(&timerLed);</font>
    $ B8 A/ V  D8 b  k
  446. <font color="#000000" face="Tahoma" size="3">}</font>% {& C' r' D& c; G$ W! @) `, [' a
  447. <font color="#000000" face="Tahoma" size="3">/* USER CODE END PrFD */</font>
复制代码
2 D6 s2 {3 t! Z% B) p1 l) ?0 r
三、下载测试2 H1 |, w3 H* r. A3 A; q$ }
最后烧录下载后,正常pingpong通信/ x# }. q/ p3 `  `- u* Y5 M4 m- r

+ H0 G9 Z) ]4 |: `5 @" |  X" p, I————————————————
& D2 T& q, X# T: t* x& o版权声明:北世安  g1 I6 ^' `% g" d- P
: p  M5 |9 c2 S  u5 p& x
! I- {! C8 `6 r8 f* l7 _
f1a0dcf8b9d240c6badd23d0ce95a879.png
e044f5c6d6824fc8b20e93cf9e7fa05e.png
赞 收藏 评论0 发布时间:2022-10-20 18:31

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版