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

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

[复制链接]
STMCU小助手 发布时间:2022-10-20 18:31
简介$ ]( f- z/ A4 F4 X* W) f0 x
官方只提供了STM32WL55JC和STM32WL55JC1的相关应用demo,由于封装不通我们并不能直接使用相关程序,需要移植才能使用。本次我们移植pingpong通信demo
# D  V6 Z& o4 P) z( c& A/ @- e& T; U: g2 ?9 Y- i# v, q
一、工程移植+ I9 y8 X6 e! I" Z$ y0 ?9 i* e* Q8 q
1、打开STM32CubeMX,选择start My projext from MCU开始工程
: T8 b# @  i# o4 m# Q
: X3 Y/ G. @" {
c9c595898d0843dcac0e6d3cb4e1e6be.png
4 z9 J- D6 x& h: A  ]% X& }0 V8 S$ R0 _* Z
2、在MCU/MPU处选择使用STM32WLE5CCU6

* m! T4 C# d$ p4 f

- J5 N8 @# ]7 l0 C% K ce759cf2bb994e39bcba330374887923.png
4 f  S" O; L2 F& k- f$ w: A. H" b# D# @+ l% h: I! Z
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
' V8 A. g% y3 G" Q用户为自己实际的用户名5 O" b0 c1 D7 i7 t) z, y- g9 o! F) G

+ a" c" Z& V- Z; I7 r
eabbd354683c4d7791a658576c0f3cfb.png 9 O& [$ @6 J% {. V# S
' ]; Y; L" x. T! }2 v. A/ L2 w! D. g
导入后会有些报错,是因为原来WL55JC是BGA的封装引脚要多一些,而stm32wle5ccu6没有
$ ^# i1 d+ T1 F' e' q
3 Q* W8 {! f3 j7 h% S5 i4、在Project Manager->Project中设置工程名和存放路径,Toolchain/IDE设置为MDK-ARM;Code Generator设置为Copy all used libraries into the project folder
9 S" ~( `4 ]: T. x4 s$ M% h/ }; D( y! B: v
d36a100f0c024b99986d29f6c8370795.png
0 w7 K, A9 Z9 p1 C7 c* g& y% N* J! p/ S% v/ g6 F
6018d91799ac4fb49e1fd28312a41a29.png
' v+ q! A* M# |( ~8 g, g: u( t  K0 C) u* J1 B- g7 G" Q
5、时钟输入配置,HSE和LSE都配置为Crystal/Ceramic Resonator) W3 u, B8 P  q  `

! R, t( Z5 T3 c# r
3 Y% U6 j$ S" E/ u: n4 ]1 |  {
bc99cbb8fda944e6a771fc51fba34ba8.png + `. r' D! ?' W# S

6 O' P/ i7 w: _6、RTC开启Alarm A并且使能中断
5 I8 Q; y6 ^7 F7 ]
$ x; w. d& i: @, B
8 M. L2 @' Q6 F
bb49a01df25445b3a4feed59805c9604.png
5 N7 \& O+ ^1 q$ {
- I$ I' x- m8 j) F! R8 N
7、SubGHz_Phy设置如下& L. m# F& X5 m: h" S9 ?% T
$ {- [$ u! N# f! `5 H
ad6a96941ad0469faa47dc07d76a261f.png
" `1 @9 J6 z0 K
+ q6 J$ w  N- d- o7 z; n( q: v7 M d4d2c6841cc64814a211c1d22d56e6d0.png $ |8 h# K( V$ W+ D0 C

" _2 k) A- F: U' I3 I8、时钟树配置,RTC使用LSE+ S9 R1 @, Q" I

6 d) j2 t$ B3 e1 a/ \) ^9 x 37d50e58e60149cdbb1d69c2afe8a907.png
0 R8 E: y. I5 l6 s, R4 A$ l3 B  N2 \. }
9、点击GENERATE CODE生成代码,打开keil工程然后编译会报以下错误,是由于我们没有添加BSP包
2 q' D; a/ N( y8 M: w" k% Q3 T" i: d4 e& }2 O% I% C. Y! y" Z
ff851680b0df4c93b9154d53d0b91cd2.png , `/ L% y# ~* u/ ?

- g: J# ]8 J: g! W9 c3 i3 B10、把下载的软件包C:\Users\用户\STM32Cube\Repository\STM32Cube_FW_WL_V1.2.0\Drivers中的BSP包拷贝到当前工程下。然后在keil中添加文件和其所在目录索引。
( F% h, G- h* F" p' e% B7 q) L0 }11、然后编译工程,0 error 0 waring
: O: ]) p8 T; o0 x. r2 U
! s* J6 ?0 Q. c4 k  ^8 H. j7 j% K! t 665fd274877f46bc90aa4e614e88c0f5.png ; b' I0 B% Y' v) A* {$ j
) _. Z8 F  X8 [! J
二、应用移植
: v" B1 Q) r  v  P9 ?, M/ r& {1、修改BSP中关于射频开关部分的引脚定义,我们使用的亿佰特的E77模块,所以射频开关为PA6和PA76 U7 R1 ^; G" r6 G* p
stm32wlxx_nucleo_radio.h修改为下面这样,我们只使用了RF_SW_CTRL3_PIN、RF_SW_CTRL1_PIN 两个脚,另一个不用管。% W2 F6 S1 s" d* E+ a

* I6 D+ w/ ?# H' ^% n7 q' F2 f* R
  1. <font color="#000000" face="Tahoma" size="3">#define RF_SW_CTRL3_PIN                          GPIO_PIN_6</font>; U+ `1 ?# A# }. }1 f
  2. <font color="#000000" face="Tahoma" size="3">#define RF_SW_CTRL3_GPIO_PORT                    GPIOA</font>
    * e0 O2 s% S( l4 O: G3 B$ N
  3. <font color="#000000" face="Tahoma" size="3">#define RF_SW_CTRL3_GPIO_CLK_ENABLE()            __HAL_RCC_GPIOC_CLK_ENABLE()</font>
    - }1 b& {: {1 g/ q* A
  4. <font color="#000000" face="Tahoma" size="3">#define RF_SW_CTRL3_GPIO_CLK_DISABLE()           __HAL_RCC_GPIOC_CLK_DISABLE()</font>
    ! G0 m+ s0 y; R% H2 ^
  5. 6 N% h7 ]5 e# X
  6. <font color="#000000" face="Tahoma" size="3">#define RF_SW_CTRL1_PIN                          GPIO_PIN_7</font>
    ( a/ Z* p, _+ Q  t1 {4 F
  7. <font color="#000000" face="Tahoma" size="3">#define RF_SW_CTRL1_GPIO_PORT                    GPIOA</font>$ D( I7 Y$ B, J, g/ Q" a
  8. <font color="#000000" face="Tahoma" size="3">#define RF_SW_CTRL1_GPIO_CLK_ENABLE()            __HAL_RCC_GPIOC_CLK_ENABLE()</font>- D& Z5 ~- L0 v( T: h3 \7 o5 C
  9. <font color="#000000" face="Tahoma" size="3">#define RF_SW_RX_GPIO_CLK_DISABLE()              __HAL_RCC_GPIOC_CLK_DISABLE()</font>
复制代码

5 _: l4 P7 H: C8 Q2 e由于射频开关不同,射频控制逻辑也需要修改,把stm32wlxx_nucleo_radio.c中射频开关修改如下所示5 ^) [! J; ~1 X* E- {  M
6 }! J5 U3 P/ X; K& P1 u' R
  1. <font color="#000000" face="Tahoma" size="3">int32_t BSP_RADIO_ConfigRFSwitch(BSP_RADIO_Switch_TypeDef Config)</font>
    6 w  o5 v' C, s3 o3 O
  2. <font color="#000000" face="Tahoma" size="3">{</font># B2 M' C  M2 D- h  H( Z! q
  3. <font color="#000000" face="Tahoma" size="3">  switch (Config)</font>+ U& K" R1 s$ ^- A5 P9 P9 [) F9 a
  4. <font color="#000000" face="Tahoma" size="3">  {</font>- I& T( `" y4 [) n1 k
  5. <font color="#000000" face="Tahoma" size="3">    case RADIO_SWITCH_OFF:</font>* x" g+ ?2 }8 m( Z
  6. <font color="#000000" face="Tahoma" size="3">    {</font>7 y) O# f& p: d* Q. ^, V9 A5 }1 a; F
  7. <font color="#000000" face="Tahoma" size="3">      /* Turn off switch */</font>" O6 T# ?; y2 K: \8 C
  8. <font color="#000000" face="Tahoma" size="3">      HAL_GPIO_WritePin(RF_SW_CTRL3_GPIO_PORT, RF_SW_CTRL3_PIN, GPIO_PIN_RESET);</font>2 g4 Q) h9 m: ]' c/ q/ v2 k7 [( s( I
  9. <font color="#000000" face="Tahoma" size="3">      HAL_GPIO_WritePin(RF_SW_CTRL1_GPIO_PORT, RF_SW_CTRL1_PIN, GPIO_PIN_RESET);</font>
    ; G6 N, }6 o0 |6 c
  10. <font color="#000000" face="Tahoma" size="3">      HAL_GPIO_WritePin(RF_SW_CTRL2_GPIO_PORT, RF_SW_CTRL2_PIN, GPIO_PIN_RESET);</font>
    $ e( _7 O' C6 O6 Y; K, _  i+ _, z1 {
  11. <font color="#000000" face="Tahoma" size="3">      break;      </font>
    . `0 d) R5 I3 l* I3 L5 G) J4 }
  12. <font color="#000000" face="Tahoma" size="3">    }</font>% m+ [4 m( e6 B9 B3 Z( ?8 m
  13. <font color="#000000" face="Tahoma" size="3">    case RADIO_SWITCH_RX:</font>
    ! {& m7 b! M# F
  14. <font color="#000000" face="Tahoma" size="3">    {</font># p- ?6 a: C/ C  |2 Z7 U
  15. <font color="#000000" face="Tahoma" size="3">      /*Turns On in Rx Mode the RF Switch */</font>; D- y; Q9 h  \$ V3 B( x) e0 W8 m
  16. <font color="#000000" face="Tahoma" size="3">      HAL_GPIO_WritePin(RF_SW_CTRL3_GPIO_PORT, RF_SW_CTRL3_PIN, GPIO_PIN_RESET);</font>7 e) [! o3 E1 T( Z! i
  17. <font color="#000000" face="Tahoma" size="3">      HAL_GPIO_WritePin(RF_SW_CTRL1_GPIO_PORT, RF_SW_CTRL1_PIN, GPIO_PIN_SET); </font>
    : o( a& H9 h# ^0 L& i' g; Y
  18. <font color="#000000" face="Tahoma" size="3">      HAL_GPIO_WritePin(RF_SW_CTRL2_GPIO_PORT, RF_SW_CTRL2_PIN, GPIO_PIN_RESET); </font>
    9 Y, U. y4 W/ L
  19. <font color="#000000" face="Tahoma" size="3">      break;</font>
    ; z9 i# ^: m7 Q. Z7 U) B
  20. <font color="#000000" face="Tahoma" size="3">    }</font>
    ' k* b# s0 U/ p/ G; B) M4 R
  21. <font color="#000000" face="Tahoma" size="3">    case RADIO_SWITCH_RFO_LP:</font>+ f4 Q( `' I2 K8 M( z' M
  22. <font color="#000000" face="Tahoma" size="3">    {</font>+ _' R3 D# I' Z3 r3 q, ^+ Z6 p3 @
  23. <font color="#000000" face="Tahoma" size="3">      /*Turns On in Tx Low Power the RF Switch */</font>- Z1 s) X  L3 |/ R6 w
  24. <font color="#000000" face="Tahoma" size="3">      HAL_GPIO_WritePin(RF_SW_CTRL3_GPIO_PORT, RF_SW_CTRL3_PIN, GPIO_PIN_SET);</font>
    # p5 T- y- L* M& ?
  25. <font color="#000000" face="Tahoma" size="3">      HAL_GPIO_WritePin(RF_SW_CTRL1_GPIO_PORT, RF_SW_CTRL1_PIN, GPIO_PIN_RESET); </font>& c- N4 h5 g8 d* G9 P; d' ?9 ?, U
  26. <font color="#000000" face="Tahoma" size="3">      HAL_GPIO_WritePin(RF_SW_CTRL2_GPIO_PORT, RF_SW_CTRL2_PIN, GPIO_PIN_SET); </font>
    ' P0 i# y' K+ E0 n
  27. <font color="#000000" face="Tahoma" size="3">      break;</font>
    ; s4 ~7 B9 q5 A! f
  28. <font color="#000000" face="Tahoma" size="3">    }</font>5 R6 J+ B' i& p1 \, L# Y- z
  29. <font color="#000000" face="Tahoma" size="3">    case RADIO_SWITCH_RFO_HP:</font>
    6 k0 ~* F6 E  m8 v) u
  30. <font color="#000000" face="Tahoma" size="3">    {</font>0 u5 S3 n* u& R% V* v
  31. <font color="#000000" face="Tahoma" size="3">      /*Turns On in Tx High Power the RF Switch */</font>
    7 B4 p9 R" o0 _0 i. P" u' E: R7 t
  32. <font color="#000000" face="Tahoma" size="3">      HAL_GPIO_WritePin(RF_SW_CTRL3_GPIO_PORT, RF_SW_CTRL3_PIN, GPIO_PIN_SET);</font>6 X# e# F7 b( Y, a1 F5 {
  33. <font color="#000000" face="Tahoma" size="3">      HAL_GPIO_WritePin(RF_SW_CTRL1_GPIO_PORT, RF_SW_CTRL1_PIN, GPIO_PIN_RESET); </font>! K1 D# B3 C2 L! ^6 k, }6 [) O
  34. <font color="#000000" face="Tahoma" size="3">      HAL_GPIO_WritePin(RF_SW_CTRL2_GPIO_PORT, RF_SW_CTRL2_PIN, GPIO_PIN_SET); </font>
    $ y/ d+ P: s7 @: {
  35. <font color="#000000" face="Tahoma" size="3">      break;</font>; v8 d( R. ?' X- H1 l+ X
  36. <font color="#000000" face="Tahoma" size="3">    }</font>
    $ p' ]5 z7 g; U1 S. Y5 t
  37. <font color="#000000" face="Tahoma" size="3">    default:</font>9 P0 P# d( A3 L2 A; G" ^1 k; F
  38. <font color="#000000" face="Tahoma" size="3">      break;    </font>
    & Q6 `4 f( B0 Y- Z' ?: g3 x4 h2 R
  39. <font color="#000000" face="Tahoma" size="3">  }  </font>7 J" y& o/ z( A; u: B/ v* }2 h4 d# H: G

  40. " d$ @3 H6 s; w6 n
  41. <font color="#000000" face="Tahoma" size="3">  return BSP_ERROR_NONE;</font>
    5 _' B$ D% H9 {4 B
  42. <font color="#000000" face="Tahoma" size="3">}</font>+ D8 b, K  |% b& i

  43. " q0 f2 {1 g. P( g; y; B
  44. <font color="#000000" face="Tahoma" size="3">int32_t BSP_RADIO_GetTxConfig(void)</font>
    8 F" D1 F! ?: w9 A/ B0 z7 A8 n! C) h
  45. <font color="#000000" face="Tahoma" size="3">{</font>
    + ~+ e. w& Q+ P  ^
  46. <font color="#000000" face="Tahoma" size="3">  //return RADIO_CONF_RFO_LP_HP;</font>
    . S4 ~+ V" ~- m! J: u# J6 V$ c
  47. <font color="#000000" face="Tahoma" size="3">        return RADIO_CONF_RFO_HP;</font>( s, w/ b) @$ \# R0 X8 [
  48. <font color="#000000" face="Tahoma" size="3">}</font># h: J) _- [1 S9 F. [

  49. . z1 z" v& J. D
  50. <font color="#000000" face="Tahoma" size="3">//</font>
    2 F: N" p- K. v* _
  51. <font color="#000000" face="Tahoma" size="3">//使用无源晶振</font>1 l% z8 W( ]6 R' B+ y6 {
  52. <font color="#000000" face="Tahoma" size="3">/**</font>
    ' _8 j: _5 Z( a' c4 X" S/ S
  53. <font color="#000000" face="Tahoma" size="3">  * @brief  Get If TCXO is to be present on board</font>' V2 j4 t6 C& S8 ?( [0 Z
  54. <font color="#000000" face="Tahoma" size="3">  * @note   never remove called by MW,</font>' E: S2 P% z* S: H* n7 I4 Z& |
  55. <font color="#000000" face="Tahoma" size="3">  * @retval</font>
    $ \7 H5 A) h" Q7 m5 {1 U$ ~8 T. i
  56. <font color="#000000" face="Tahoma" size="3">  *  RADIO_CONF_TCXO_NOT_SUPPORTED</font>9 x! Z0 e7 V) |3 T7 U
  57. <font color="#000000" face="Tahoma" size="3">  *  RADIO_CONF_TCXO_SUPPORTED</font>
    ! E4 U) H6 s6 u/ ?: ]) v
  58. <font color="#000000" face="Tahoma" size="3">  */</font>
    3 m9 N! B6 D/ ?
  59. <font color="#000000" face="Tahoma" size="3">int32_t BSP_RADIO_IsTCXO(void)</font>
    , W5 i/ {4 L1 m
  60. <font color="#000000" face="Tahoma" size="3">{</font>; k+ u* t7 d4 @2 L' d" ~
  61. <font color="#000000" face="Tahoma" size="3">  //return RADIO_CONF_TCXO_SUPPORTED;</font>7 K: a3 e% [3 i$ j6 c9 l. S
  62. <font color="#000000" face="Tahoma" size="3">        return RADIO_CONF_TCXO_NOT_SUPPORTED</font>
    1 N/ @& D5 S6 N
  63. <font color="#000000" face="Tahoma" size="3">}</font>
    # Y9 q6 ]7 Y6 F+ n: N
  64. <font color="#000000" face="Tahoma" size="3">由于亿佰特的E77模块使用的是无源晶振,所以需要调整晶振负载电容以保证晶振精度</font>
    8 W/ [+ a* H" W* T1 {4 v: n
  65. <font color="#000000" face="Tahoma" size="3">(这里不调整也可,因为是两个模块互通,但考虑后面lorawan工程还是调整为好),采用</font>
    6 {$ s* w3 N% b! F/ c* X  t
  66. <font color="#000000" face="Tahoma" size="3">模块厂商推荐值0x0B</font>% h: N( w, y4 @% ^' f
  67. <font color="#000000" face="Tahoma" size="3">//#define XTAL_DEFAULT_CAP_VALUE      ( 0x20UL )</font># u$ `9 q9 T1 P  K! b% t9 g: ^6 k
  68. <font color="#000000" face="Tahoma" size="3">#define XTAL_DEFAULT_CAP_VALUE      ( 0x0BUL )</font>
复制代码
4 a0 B* r  h9 a8 X$ N2 @
2、修改subghz_phy_app.c文件,CubeMx刚生成工程是没有应用程序的。我们只需要从STM32Cube_FW_WL_V1.2.0软件包中去找到对应的工程文件然后修改,修改后的subghz_phy_appp.c如下。1 d" T- W5 H9 v0 \' K

7 e' k, H% {  a% h
  1. <font color="#000000" face="Tahoma" size="3">/* USER CODE BEGIN Header */</font>
    4 n9 A$ n- Q0 V" ?
  2. <font color="#000000" face="Tahoma" size="3">/**</font>3 u0 x4 W  M* i. R: f, r
  3. <font color="#000000" face="Tahoma" size="3">  ******************************************************************************</font>- _7 O; R+ E0 i( b: ~
  4. <font color="#000000" face="Tahoma" size="3">  * @file    subghz_phy_app.c</font>8 H* [" ^/ W6 ^
  5. <font color="#000000" face="Tahoma" size="3">  * @author  MCD Application Team</font>* j" f' v/ [0 D
  6. <font color="#000000" face="Tahoma" size="3">  * @brief   Application of the SubGHz_Phy Middleware</font>/ ^: @, s2 ^& @6 g" \' T8 t  m; b
  7. <font color="#000000" face="Tahoma" size="3">  ******************************************************************************</font>! D& o3 W: j# i  S6 c0 u
  8. <font color="#000000" face="Tahoma" size="3">  * @attention</font>2 d1 J$ y4 W; `& y& l" D1 g$ J/ h
  9. <font color="#000000" face="Tahoma" size="3">  *</font>
    8 K' P) o3 Z- X) n2 \6 y  I
  10. <font color="#000000" face="Tahoma" size="3">  * Copyright (c) 2022 STMicroelectronics.</font>1 H8 j( ^! R7 G3 C5 @: N  N
  11. <font color="#000000" face="Tahoma" size="3">  * All rights reserved.</font>
    $ ]/ T7 v0 q5 e5 ?/ b+ B, x
  12. <font color="#000000" face="Tahoma" size="3">  *</font>) {, L  w# d" I% `: o
  13. <font color="#000000" face="Tahoma" size="3">  * This software is licensed under terms that can be found in the LICENSE file</font>) J! s+ g9 c5 j* ]$ X% @8 F
  14. <font color="#000000" face="Tahoma" size="3">  * in the root directory of this software component.</font># y* t% i" |' I( h2 b$ y
  15. <font color="#000000" face="Tahoma" size="3">  * If no LICENSE file comes with this software, it is provided AS-IS.</font>+ v' G! M" e& \
  16. <font color="#000000" face="Tahoma" size="3">  *</font>
    ! w6 C7 U; R' \  u
  17. <font color="#000000" face="Tahoma" size="3">  ******************************************************************************</font>* P5 d9 D  S( U5 b: W
  18. <font color="#000000" face="Tahoma" size="3">  */</font>$ ]8 w  {6 i* c6 y+ x# ], T* p
  19. <font color="#000000" face="Tahoma" size="3">/* USER CODE END Header */</font>
    0 l" Y: u/ v2 m7 A9 L

  20. , y1 D  L, ?9 x/ t% c5 ~5 Q; e; t
  21. <font color="#000000" face="Tahoma" size="3">/* Includes ------------------------------------------------------------------*/</font>/ c0 q& F/ H5 M, M+ G8 D6 n8 b
  22. <font color="#000000" face="Tahoma" size="3">#include "platform.h"</font>
    ! A9 e+ o0 a" V% O3 S
  23. <font color="#000000" face="Tahoma" size="3">#include "sys_app.h"</font>: a& B/ V; m! R5 b+ S& |
  24. <font color="#000000" face="Tahoma" size="3">#include "subghz_phy_app.h"</font>
    ' q; h- ^' j5 {! \8 ^& f
  25. <font color="#000000" face="Tahoma" size="3">#include "radio.h"</font>0 w5 W- u3 p) [: e+ s- s

  26. 7 q* K; [7 r. B% g( P* y
  27. <font color="#000000" face="Tahoma" size="3">/* USER CODE BEGIN Includes */</font>- t+ D2 @% K$ l- Q
  28. <font color="#000000" face="Tahoma" size="3">#include "stm32_timer.h"</font>
    1 d4 R5 @& i' r- h4 u- X
  29. <font color="#000000" face="Tahoma" size="3">#include "stm32_seq.h"</font>$ k: E& N; j6 f3 _6 `
  30. <font color="#000000" face="Tahoma" size="3">#include "utilities_def.h"</font>
    3 \; j1 K9 `( H. H' ^$ i
  31. <font color="#000000" face="Tahoma" size="3">#include "app_version.h"</font>
      y2 S8 q; G1 \; ^* U+ o0 [
  32. <font color="#000000" face="Tahoma" size="3">#include "subghz_phy_version.h"</font>1 [  r/ a) l8 Z1 B' V
  33. <font color="#000000" face="Tahoma" size="3">/* USER CODE END Includes */</font>; p  z" m* e( a2 m7 Q2 }

  34. 4 d! o3 a2 G$ y$ D; T
  35. <font color="#000000" face="Tahoma" size="3">/* External variables ---------------------------------------------------------*/</font>+ B) B( \3 N6 s- b. E$ ^) V5 Y
  36. <font color="#000000" face="Tahoma" size="3">/* USER CODE BEGIN EV */</font>
    6 C6 l6 P, S- y7 G; s# ~- t! n# p  T

  37. ( {4 I: T% M* Z. e7 x9 K
  38. <font color="#000000" face="Tahoma" size="3">/* USER CODE END EV */</font>
    8 k: C; o4 ?2 E1 i% T
  39. . R- R) w) G5 c1 U
  40. <font color="#000000" face="Tahoma" size="3">/* Private typedef -----------------------------------------------------------*/</font>9 C9 L/ s, M9 S: q& [
  41. 3 Q1 W5 |% W8 m5 L
  42. <font color="#000000" face="Tahoma" size="3">/* USER CODE BEGIN PTD */</font>9 \$ |4 n2 p6 N8 _3 l! Z
  43. <font color="#000000" face="Tahoma" size="3">typedef enum</font>
    1 ]! e1 H: A" Z
  44. <font color="#000000" face="Tahoma" size="3">{</font>
    + ^2 O" i. ~; ]4 E# u; a+ l! {. Q2 G
  45. <font color="#000000" face="Tahoma" size="3">  RX,</font>& \4 V+ \+ ?- S
  46. <font color="#000000" face="Tahoma" size="3">  RX_TIMEOUT,</font>. T+ \+ D. b0 P5 t) x2 O* m
  47. <font color="#000000" face="Tahoma" size="3">  RX_ERROR,</font>8 @1 ]7 q" {4 h& `5 R4 c
  48. <font color="#000000" face="Tahoma" size="3">  TX,</font>( S- `. k/ K: }' J7 z
  49. <font color="#000000" face="Tahoma" size="3">  TX_TIMEOUT,</font>. L" R' M% }0 `/ D! V2 x1 X: ?3 q
  50. <font color="#000000" face="Tahoma" size="3">} States_t;</font>5 b2 [' U# z- s$ S3 A
  51. <font color="#000000" face="Tahoma" size="3">/* USER CODE END PTD */</font>
    / h3 b" N2 ?) A7 l

  52. $ q; X; m( p) ^& n; `5 n
  53. <font color="#000000" face="Tahoma" size="3">/* Private define ------------------------------------------------------------*/</font>' {* |& [" ^3 t9 ^, f, E3 K! E' r3 Q
  54. <font color="#000000" face="Tahoma" size="3">/* USER CODE BEGIN PD */</font>
    1 B( y! G+ j1 c2 t
  55. <font color="#000000" face="Tahoma" size="3">/* Configurations */</font>4 q4 L3 c7 N9 l( r
  56. <font color="#000000" face="Tahoma" size="3">/*Timeout*/</font>
    2 y% J9 K+ }) F3 C$ q  k8 H( c
  57. <font color="#000000" face="Tahoma" size="3">#define RX_TIMEOUT_VALUE              3000</font>
    + V$ _- e; t. \: \0 ~& }- L8 v, R
  58. <font color="#000000" face="Tahoma" size="3">#define TX_TIMEOUT_VALUE              3000</font>+ a! N$ D  \2 d" D* Z$ S
  59. <font color="#000000" face="Tahoma" size="3">/* PING string*/</font>9 i& s4 d% Y7 f+ `4 ]! {
  60. <font color="#000000" face="Tahoma" size="3">#define PING "PING"</font>8 o' \+ a' j2 N
  61. <font color="#000000" face="Tahoma" size="3">/* PONG string*/</font># q0 Q; |" [5 b3 }
  62. <font color="#000000" face="Tahoma" size="3">#define PONG "PONG"</font>  s& _3 s( O) l3 b" {
  63. <font color="#000000" face="Tahoma" size="3">/*Size of the payload to be sent*/</font>
    : D  S/ G; L) h, g$ ~
  64. <font color="#000000" face="Tahoma" size="3">/* Size must be greater of equal the PING and PONG*/</font>1 a9 p) J; o: T  S( i2 S
  65. <font color="#000000" face="Tahoma" size="3">#define MAX_APP_BUFFER_SIZE          255</font>/ v9 L& {4 ?' k7 B
  66. <font color="#000000" face="Tahoma" size="3">#if (PAYLOAD_LEN > MAX_APP_BUFFER_SIZE)</font>6 A) }4 }' L+ J0 _* Z& R
  67. <font color="#000000" face="Tahoma" size="3">#error PAYLOAD_LEN must be less or equal than MAX_APP_BUFFER_SIZE</font>: v9 a. X5 S0 \4 `) D3 i
  68. <font color="#000000" face="Tahoma" size="3">#endif /* (PAYLOAD_LEN > MAX_APP_BUFFER_SIZE) */</font>
    " L' u! `8 ]! j8 u7 h6 X( t
  69. <font color="#000000" face="Tahoma" size="3">/* wait for remote to be in Rx, before sending a Tx frame*/</font>; _, O6 n" ]8 s' m7 U2 z
  70. <font color="#000000" face="Tahoma" size="3">#define RX_TIME_MARGIN                200</font>! l( m/ c! P4 y6 w: B" Z# M
  71. <font color="#000000" face="Tahoma" size="3">/* Afc bandwidth in Hz */</font>
    , S, a7 x/ e. n7 x7 G( o5 S
  72. <font color="#000000" face="Tahoma" size="3">#define FSK_AFC_BANDWIDTH             83333</font>
    8 c# N, t1 S9 W; }& f
  73. <font color="#000000" face="Tahoma" size="3">/* LED blink Period*/</font>
    1 ~: S/ p+ K5 ^" L+ F% r
  74. <font color="#000000" face="Tahoma" size="3">#define LED_PERIOD_MS                 200</font>
    . {0 `: l- A; A9 {; B& _
  75. <font color="#000000" face="Tahoma" size="3">/* USER CODE END PD */</font>, q6 U* }2 H1 p& l% Z! }: Q5 U! A
  76. 4 a: h  u9 u% j4 `" w& @. v
  77. <font color="#000000" face="Tahoma" size="3">/* Private macro -------------------------------------------------------------*/</font>
    2 h: ~& M2 u. z5 r, b- ~3 p0 F; X
  78. <font color="#000000" face="Tahoma" size="3">/* USER CODE BEGIN PM */</font>
    0 U7 d2 v8 V/ h2 a1 x

  79. + M' G6 I& Y) F& [& r5 H8 ]
  80. <font color="#000000" face="Tahoma" size="3">/* USER CODE END PM */</font>1 @" `) Q& Q. G1 ~. [
  81. " b9 `7 Y! ~% {+ C# t$ g" V% x
  82. <font color="#000000" face="Tahoma" size="3">/* Private variables ---------------------------------------------------------*/</font>
    2 ?# f1 _$ V0 n
  83. <font color="#000000" face="Tahoma" size="3">/* Radio events function pointer */</font>
    ) B% C  c0 P# O# ?9 Y6 W
  84. <font color="#000000" face="Tahoma" size="3">static RadioEvents_t RadioEvents;</font>( e: T* d; S5 H# H' p9 y2 G9 ?. f
  85. <font color="#000000" face="Tahoma" size="3">/* USER CODE BEGIN PV */</font>
    . @, W' l6 g1 ^3 C7 a2 P( u& X- _! k
  86. <font color="#000000" face="Tahoma" size="3">/*Ping Pong FSM states */</font>% i5 M3 s$ ?5 T4 J
  87. <font color="#000000" face="Tahoma" size="3">static States_t State = RX;</font>
    : u: \0 ~4 @# c1 x
  88. <font color="#000000" face="Tahoma" size="3">/* App Rx Buffer*/</font>
    2 M; ]4 ^' w1 L2 K) D; Q4 e
  89. <font color="#000000" face="Tahoma" size="3">static uint8_t BufferRx[MAX_APP_BUFFER_SIZE];</font>- y5 q( \8 X4 H/ z6 Q* U3 c) R4 e1 m
  90. <font color="#000000" face="Tahoma" size="3">/* App Tx Buffer*/</font>* V) |8 M* w: B# M" o: L
  91. <font color="#000000" face="Tahoma" size="3">static uint8_t BufferTx[MAX_APP_BUFFER_SIZE];</font>* u5 _& j" f# B7 W7 b: R6 M) R8 V
  92. <font color="#000000" face="Tahoma" size="3">/* Last  Received Buffer Size*/</font>
    . r( v$ C. Q* O9 }8 g# H' ]& L6 p
  93. <font color="#000000" face="Tahoma" size="3">uint16_t RxBufferSize = 0;</font>
    7 D9 {6 p# ^) n9 u; T$ u
  94. <font color="#000000" face="Tahoma" size="3">/* Last  Received packer Rssi*/</font>
    $ g) f0 f. c/ u  \
  95. <font color="#000000" face="Tahoma" size="3">int8_t RssiValue = 0;</font>5 ~' V- z' g! S  K, }
  96. <font color="#000000" face="Tahoma" size="3">/* Last  Received packer SNR (in Lora modulation)*/</font>
    . l$ ~. o7 v- Z6 r
  97. <font color="#000000" face="Tahoma" size="3">int8_t SnrValue = 0;</font>. C, m/ o0 ?4 X) \5 w* @
  98. <font color="#000000" face="Tahoma" size="3">/* Led Timers objects*/</font>
      R! n2 d/ \$ M/ j3 b8 h
  99. <font color="#000000" face="Tahoma" size="3">static UTIL_TIMER_Object_t timerLed;</font>$ @6 k& W; V) E9 h$ k, M; b  C
  100. <font color="#000000" face="Tahoma" size="3">/* device state. Master: true, Slave: false*/</font>/ ~+ J# A* Z8 H, w- k0 J0 U
  101. <font color="#000000" face="Tahoma" size="3">bool isMaster = true;</font>
      z: h- s" `. @
  102. <font color="#000000" face="Tahoma" size="3">/* random delay to make sure 2 devices will sync*/</font>
    % P9 Q; G$ J6 L" H6 k: @% ~
  103. <font color="#000000" face="Tahoma" size="3">/* the closest the random delays are, the longer it will</font>( k! t4 R- T) _/ d/ E
  104. <font color="#000000" face="Tahoma" size="3">   take for the devices to sync when started simultaneously*/</font>
    , n! q9 u9 b  V
  105. <font color="#000000" face="Tahoma" size="3">static int32_t random_delay;</font>3 U: I/ N# i& b0 v6 L/ g
  106. <font color="#000000" face="Tahoma" size="3">/* USER CODE END PV */</font>
    3 t9 @! K6 t% m( _. J2 x

  107. : L! V" U* a# |8 ?
  108. <font color="#000000" face="Tahoma" size="3">/* Private function prototypes -----------------------------------------------*/</font>
    & d3 }/ p; @' _7 \' \
  109. <font color="#000000" face="Tahoma" size="3">/*!</font>! y- g& E, F! x8 t
  110. <font color="#000000" face="Tahoma" size="3"> * @brief Function to be executed on Radio Tx Done event</font>8 a6 h% f. v8 d- t6 ~7 U1 I
  111. <font color="#000000" face="Tahoma" size="3"> */</font>
    : d! m2 u8 Q; L) A- O& v# Z
  112. <font color="#000000" face="Tahoma" size="3">static void OnTxDone(void);</font>
    $ K: I; x. A' q% O# N

  113. * w) c% F# I# Q$ K) z+ V
  114. <font color="#000000" face="Tahoma" size="3">/**</font>  Q8 X8 z4 h+ C" R3 y; h
  115. <font color="#000000" face="Tahoma" size="3">  * @brief Function to be executed on Radio Rx Done event</font>  S$ a* M/ S3 O: K" k* ?. a
  116. <font color="#000000" face="Tahoma" size="3">  * @param  payload ptr of buffer received</font>: _" H! h* J! n/ U. }. @0 n
  117. <font color="#000000" face="Tahoma" size="3">  * @param  size buffer size</font>- F/ P5 H2 L; K5 T7 ~- f; ^% @
  118. <font color="#000000" face="Tahoma" size="3">  * @param  rssi</font>
    4 _* i! Z/ k) H+ j
  119. <font color="#000000" face="Tahoma" size="3">  * @param  LoraSnr_FskCfo</font>
    , F$ K, ^" D2 G+ z7 G# ?2 e
  120. <font color="#000000" face="Tahoma" size="3">  */</font>
    2 }: [3 w! z2 M! j5 w: ~! U
  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>) V5 V! t5 @4 ]  i1 H2 x

  122.   @  i6 x/ S1 y! x
  123. <font color="#000000" face="Tahoma" size="3">/**</font>8 _$ V! E7 B. A) B9 D: T
  124. <font color="#000000" face="Tahoma" size="3">  * @brief Function executed on Radio Tx Timeout event</font>
    / F# E& |% b: V5 C
  125. <font color="#000000" face="Tahoma" size="3">  */</font>
    + d2 k# s5 i; U0 `) H
  126. <font color="#000000" face="Tahoma" size="3">static void OnTxTimeout(void);</font>) v4 S1 ~+ a# b9 ?
  127. ! N8 ?+ ^- ]; s$ T5 f
  128. <font color="#000000" face="Tahoma" size="3">/**</font>4 w3 e% |' c" v4 m& o
  129. <font color="#000000" face="Tahoma" size="3">  * @brief Function executed on Radio Rx Timeout event</font>
    0 L$ p* }* F5 Z0 ]! u3 m, b
  130. <font color="#000000" face="Tahoma" size="3">  */</font>2 o# Q7 `/ g- F/ {1 L+ @6 }
  131. <font color="#000000" face="Tahoma" size="3">static void OnRxTimeout(void);</font>
    , k1 i$ W. y8 Q. u$ v
  132. 4 A% r" s3 e: U8 `( G/ R! t
  133. <font color="#000000" face="Tahoma" size="3">/**</font>. A5 V. z2 C4 s1 {2 {& T$ T
  134. <font color="#000000" face="Tahoma" size="3">  * @brief Function executed on Radio Rx Error event</font>
    2 d$ C' k4 o+ ?. G% _5 q1 }
  135. <font color="#000000" face="Tahoma" size="3">  */</font>( P8 R9 b" D, A( e& [0 e
  136. <font color="#000000" face="Tahoma" size="3">static void OnRxError(void);</font>
    / K3 l) }* R2 I$ A0 a8 w: Y/ `

  137. 1 `- E" n! g" z
  138. <font color="#000000" face="Tahoma" size="3">/* USER CODE BEGIN PFP */</font>- h- ]" U- H" t
  139. <font color="#000000" face="Tahoma" size="3">/**</font>
    . k$ X! R" n1 S2 \' |
  140. <font color="#000000" face="Tahoma" size="3">  * @brief  Function executed on when led timer elapses</font>; z* l" @' z& m( [0 B
  141. <font color="#000000" face="Tahoma" size="3">  * @param  context ptr of LED context</font>% U; @( z; P: Q8 s: ~$ c, K4 ^
  142. <font color="#000000" face="Tahoma" size="3">  */</font>6 W9 T% e! L% W; s% ^1 F
  143. <font color="#000000" face="Tahoma" size="3">static void OnledEvent(void *context);</font>
    9 {5 N' x8 P" G: N
  144. % U$ U' F9 x/ {* W
  145. <font color="#000000" face="Tahoma" size="3">/**</font>
    ( M+ R' Y# l2 ^  Z
  146. <font color="#000000" face="Tahoma" size="3">  * @brief PingPong state machine implementation</font>
    8 f+ V% N- v! c! b
  147. <font color="#000000" face="Tahoma" size="3">  */</font>
    ' n; f+ k+ A6 r: B9 l+ h! G/ n
  148. <font color="#000000" face="Tahoma" size="3">static void PingPong_Process(void);</font>
    ( W; F. D3 H7 N% \) N9 s3 h" |7 |
  149. <font color="#000000" face="Tahoma" size="3">/* USER CODE END PFP */</font># m) H. I5 ~  h) ?' t  W

  150. 4 d" j) Y2 f5 X+ Q% B
  151. <font color="#000000" face="Tahoma" size="3">/* Exported functions ---------------------------------------------------------*/</font>
    $ p4 j# f- v# k% u! g" n( L
  152. <font color="#000000" face="Tahoma" size="3">void SubghzApp_Init(void)</font>
    " ]( R4 H. l% h2 ~# q- e% }3 e
  153. <font color="#000000" face="Tahoma" size="3">{</font>
    + @, n8 ?) {# Q- D6 T9 k& A
  154. <font color="#000000" face="Tahoma" size="3">  /* USER CODE BEGIN SubghzApp_Init_1 */</font>, F& G# `! l/ G( Z7 I" D
  155. <font color="#000000" face="Tahoma" size="3">  APP_LOG(TS_OFF, VLEVEL_M, "\n\rPING PONG\n\r");</font>
    + H" r* a5 m+ [- f3 E/ `2 L
  156. <font color="#000000" face="Tahoma" size="3">  /* Get SubGHY_Phy APP version*/</font>
    % X( @/ x) z4 N
  157. <font color="#000000" face="Tahoma" size="3">  APP_LOG(TS_OFF, VLEVEL_M, "APPLICATION_VERSION: V%X.%X.%X\r\n",</font># N2 d1 ^# l. n) U5 m* g: Z
  158. <font color="#000000" face="Tahoma" size="3">          (uint8_t)(APP_VERSION_MAIN),</font>
    5 R  ]% P# A. s  O# i
  159. <font color="#000000" face="Tahoma" size="3">          (uint8_t)(APP_VERSION_SUB1),</font>
    9 q4 Z$ l& f8 e% g- r
  160. <font color="#000000" face="Tahoma" size="3">          (uint8_t)(APP_VERSION_SUB2));</font># k) ]0 |- w3 y- G- A. W; I9 {; G8 V

  161. * u+ L( a. C6 X2 y' t
  162. <font color="#000000" face="Tahoma" size="3">  /* Get MW SubGhz_Phy info */</font>
    * @) V) N. h, l0 d' g; u0 d% A# q
  163. <font color="#000000" face="Tahoma" size="3">  APP_LOG(TS_OFF, VLEVEL_M, "MW_RADIO_VERSION:    V%X.%X.%X\r\n",</font>& ?/ U9 j7 i3 f1 i  Y" s
  164. <font color="#000000" face="Tahoma" size="3">          (uint8_t)(SUBGHZ_PHY_VERSION_MAIN),</font>
    + |% J+ R2 a8 J  @' F
  165. <font color="#000000" face="Tahoma" size="3">          (uint8_t)(SUBGHZ_PHY_VERSION_SUB1),</font>
    # P$ [: _; A( I3 m
  166. <font color="#000000" face="Tahoma" size="3">          (uint8_t)(SUBGHZ_PHY_VERSION_SUB2));</font>. r+ D+ m, v6 Z

  167. & K8 ^. `0 c. I2 r! b2 |
  168. <font color="#000000" face="Tahoma" size="3">  /* Led Timers*/</font>: _% [7 T  `+ L8 }0 {
  169. <font color="#000000" face="Tahoma" size="3">  UTIL_TIMER_Create(&timerLed, LED_PERIOD_MS, UTIL_TIMER_ONESHOT, OnledEvent, NULL);</font>0 C" M- w$ f* ?
  170. <font color="#000000" face="Tahoma" size="3">  UTIL_TIMER_Start(&timerLed);</font># f/ n! j: t8 K) X3 I9 N8 @
  171. <font color="#000000" face="Tahoma" size="3">  /* USER CODE END SubghzApp_Init_1 */</font>
    9 [2 [0 J* A* i) N

  172. 6 X3 l9 v7 ~  M: u; I
  173. <font color="#000000" face="Tahoma" size="3">  /* Radio initialization */</font>
    6 |" Z& e* V: H' k1 |& ]
  174. <font color="#000000" face="Tahoma" size="3">  RadioEvents.TxDone = OnTxDone;</font>) d2 @( E  E+ j, W* o
  175. <font color="#000000" face="Tahoma" size="3">  RadioEvents.RxDone = OnRxDone;</font>, `* p- `0 b. b/ k
  176. <font color="#000000" face="Tahoma" size="3">  RadioEvents.TxTimeout = OnTxTimeout;</font>' ~. h& Z8 X) D% L
  177. <font color="#000000" face="Tahoma" size="3">  RadioEvents.RxTimeout = OnRxTimeout;</font># D6 g4 N+ x. T" Z
  178. <font color="#000000" face="Tahoma" size="3">  RadioEvents.RxError = OnRxError;</font>6 t8 w! P, W  V1 k
  179. & e; W8 V& v6 j- O
  180. <font color="#000000" face="Tahoma" size="3">  Radio.Init(&RadioEvents);</font>
    ' I. }) [% r% K; A% @+ ~6 r
  181. ' [5 n' w. F+ V+ \
  182. <font color="#000000" face="Tahoma" size="3">  /* USER CODE BEGIN SubghzApp_Init_2 */</font>' `- a& X0 n1 Z# {- q4 d$ K+ D
  183. <font color="#000000" face="Tahoma" size="3">/*calculate random delay for synchronization*/</font>" F+ g7 l1 d( _5 U! s+ s% h/ q* P
  184. <font color="#000000" face="Tahoma" size="3">  random_delay = (Radio.Random()) >> 22; /*10bits random e.g. from 0 to 1023 ms*/</font>- h! z4 T1 ^2 V# Z) O4 m

  185. 0 f- I" m6 Q# r( m/ Y  c
  186. <font color="#000000" face="Tahoma" size="3">  /* Radio Set frequency */</font>
    ' V$ `! y- h4 r3 a
  187. <font color="#000000" face="Tahoma" size="3">  Radio.SetChannel(RF_FREQUENCY);</font>+ Q0 r- ]) F, f" U- N' N

  188. ' F' p: @5 `8 A, j& \
  189. <font color="#000000" face="Tahoma" size="3">  /* Radio configuration */</font>6 p& U3 G4 J- J
  190. <font color="#000000" face="Tahoma" size="3">#if ((USE_MODEM_LORA == 1) && (USE_MODEM_FSK == 0))</font>3 y. `! n! w, ?1 [6 m9 `
  191. <font color="#000000" face="Tahoma" size="3">  APP_LOG(TS_OFF, VLEVEL_M, "---------------\n\r");</font>
    8 o! S% d% x( d! w3 d
  192. <font color="#000000" face="Tahoma" size="3">  APP_LOG(TS_OFF, VLEVEL_M, "LORA_MODULATION\n\r");</font>+ Z: t  I0 c: u) Z7 i
  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>. p1 g# O1 K" @( |6 O+ x
  194. <font color="#000000" face="Tahoma" size="3">  APP_LOG(TS_OFF, VLEVEL_M, "LORA_SF=%d\n\r", LORA_SPREADING_FACTOR);</font>
    " J' M: \8 }+ l
  195. ' H# g- K. c7 X
  196. <font color="#000000" face="Tahoma" size="3">  Radio.SetTxConfig(MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH,</font>) T, U% D! W6 b& W, N( W; ^0 {
  197. <font color="#000000" face="Tahoma" size="3">                    LORA_SPREADING_FACTOR, LORA_CODINGRATE,</font>
    / D4 r1 l) |4 C/ ~* {0 [' i: c
  198. <font color="#000000" face="Tahoma" size="3">                    LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON,</font>
    8 i* s$ J  ^( ?- M. u' u, R
  199. <font color="#000000" face="Tahoma" size="3">                    true, 0, 0, LORA_IQ_INVERSION_ON, TX_TIMEOUT_VALUE);</font>. f- H* W1 k& w$ R  O' o. {
  200. ; [( K, K% I3 a/ s8 ^: r
  201. <font color="#000000" face="Tahoma" size="3">  Radio.SetRxConfig(MODEM_LORA, LORA_BANDWIDTH, LORA_SPREADING_FACTOR,</font># ^6 u5 y3 a! [' O( @8 K3 j9 p
  202. <font color="#000000" face="Tahoma" size="3">                    LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH,</font>
    & {( W9 N( g& m: ~8 t  O1 [
  203. <font color="#000000" face="Tahoma" size="3">                    LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON,</font>
    3 U8 T/ i9 Z# D4 j3 @
  204. <font color="#000000" face="Tahoma" size="3">                    0, true, 0, 0, LORA_IQ_INVERSION_ON, true);</font>
    6 [1 Y) [4 y; O* _% C6 Q
  205. 3 [  a; U. Q8 g3 M& [
  206. <font color="#000000" face="Tahoma" size="3">  Radio.SetMaxPayloadLength(MODEM_LORA, MAX_APP_BUFFER_SIZE);</font>- R& s; F5 n# T9 Z

  207. 6 S/ L' x; |+ u( o" M: n
  208. <font color="#000000" face="Tahoma" size="3">#elif ((USE_MODEM_LORA == 0) && (USE_MODEM_FSK == 1))</font>0 w' X/ n+ B- v* H9 }% @  x
  209. <font color="#000000" face="Tahoma" size="3">  APP_LOG(TS_OFF, VLEVEL_M, "---------------\n\r");</font>. W+ @1 a0 o+ u5 A$ T  i
  210. <font color="#000000" face="Tahoma" size="3">  APP_LOG(TS_OFF, VLEVEL_M, "FSK_MODULATION\n\r");</font>! V% K) A+ Z: x
  211. <font color="#000000" face="Tahoma" size="3">  APP_LOG(TS_OFF, VLEVEL_M, "FSK_BW=%d Hz\n\r", FSK_BANDWIDTH);</font>3 F. S. g5 y/ s6 R# c
  212. <font color="#000000" face="Tahoma" size="3">  APP_LOG(TS_OFF, VLEVEL_M, "FSK_DR=%d bits/s\n\r", FSK_DATARATE);</font>& T. ]3 p* |8 G. K, L4 f" f
  213. ' Z- K8 _. x4 g& h2 w) `
  214. <font color="#000000" face="Tahoma" size="3">  Radio.SetTxConfig(MODEM_FSK, TX_OUTPUT_POWER, FSK_FDEV, 0,</font>
    2 Z0 ^. M! K4 o5 q/ F. |' G
  215. <font color="#000000" face="Tahoma" size="3">                    FSK_DATARATE, 0,</font>5 X  A' x9 Y5 `4 T" r9 D
  216. <font color="#000000" face="Tahoma" size="3">                    FSK_PREAMBLE_LENGTH, FSK_FIX_LENGTH_PAYLOAD_ON,</font>
    2 q) T% B3 i, J" }! x2 F
  217. <font color="#000000" face="Tahoma" size="3">                    true, 0, 0, 0, TX_TIMEOUT_VALUE);</font>
    + m2 C! _& L( n, x% D6 I" a  Q" f

  218. ! K, w: n/ Z  |$ F; d, p8 t0 A3 I
  219. <font color="#000000" face="Tahoma" size="3">  Radio.SetRxConfig(MODEM_FSK, FSK_BANDWIDTH, FSK_DATARATE,</font>
    $ v0 V4 v9 N0 p3 B( Z
  220. <font color="#000000" face="Tahoma" size="3">                    0, FSK_AFC_BANDWIDTH, FSK_PREAMBLE_LENGTH,</font># ?. I8 P* t! z# b6 p
  221. <font color="#000000" face="Tahoma" size="3">                    0, FSK_FIX_LENGTH_PAYLOAD_ON, 0, true,</font>) |+ S/ B- W4 y# k+ j6 o
  222. <font color="#000000" face="Tahoma" size="3">                    0, 0, false, true);</font>
    : b6 J0 b' P9 J' ]( e% ?- C+ V7 S( M

  223. 9 ~' F# Y$ P% C. G6 f
  224. <font color="#000000" face="Tahoma" size="3">  Radio.SetMaxPayloadLength(MODEM_FSK, MAX_APP_BUFFER_SIZE);</font>
    ) A/ V: ?3 K6 J) M
  225. * t4 e) }% \! I6 E2 Z! O
  226. <font color="#000000" face="Tahoma" size="3">#else</font>( J: w& a0 y7 g
  227. <font color="#000000" face="Tahoma" size="3">#error "Please define a modulation in the subghz_phy_app.h file."</font>; a6 S* K; X) ?7 R9 m8 i, n
  228. <font color="#000000" face="Tahoma" size="3">#endif /* USE_MODEM_LORA | USE_MODEM_FSK */</font>
    8 r# ^1 a; T  o/ n. j8 T
  229. 0 Q* e7 p8 S: O5 b0 K
  230. <font color="#000000" face="Tahoma" size="3">  /*fills tx buffer*/</font>  O. W% L3 k, W1 Y
  231. <font color="#000000" face="Tahoma" size="3">  memset(BufferTx, 0x0, MAX_APP_BUFFER_SIZE);</font>7 j5 s% D# |( d4 F/ f/ Y

  232. - A7 s/ i  p% f$ H
  233. <font color="#000000" face="Tahoma" size="3">  APP_LOG(TS_ON, VLEVEL_L, "rand=%d\n\r", random_delay);</font>1 B/ C9 j2 H/ S, E
  234. <font color="#000000" face="Tahoma" size="3">  /*starts reception*/</font>
    5 |2 S2 E, |+ h/ Y* X0 }% D
  235. <font color="#000000" face="Tahoma" size="3">  Radio.Rx(RX_TIMEOUT_VALUE + random_delay);</font>7 p; z+ z7 M3 ^' g! W

  236.   x. t9 Y4 N1 y
  237. <font color="#000000" face="Tahoma" size="3">  /*register task to to be run in while(1) after Radio IT*/</font>
    : B/ y% b5 S; O
  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>
    ( \9 c) c. |3 ~8 V# L$ \2 E
  239. <font color="#000000" face="Tahoma" size="3">  /* USER CODE END SubghzApp_Init_2 */</font>. i+ t6 F7 h. A" R
  240. <font color="#000000" face="Tahoma" size="3">}</font>- F; m% V: @# a7 g+ l0 e

  241. 8 A! j7 y2 _& O! U( H2 e) }0 [
  242. <font color="#000000" face="Tahoma" size="3">/* USER CODE BEGIN EF */</font>
    ) J+ z) s$ X0 Z1 b! }3 L' t

  243. ' k6 H) n2 p; e  T; `! r4 `
  244. <font color="#000000" face="Tahoma" size="3">/* USER CODE END EF */</font>
    " @9 o* L6 P8 h( K' w
  245. & _! X6 w6 d: R7 w/ M
  246. <font color="#000000" face="Tahoma" size="3">/* Private functions ---------------------------------------------------------*/</font>
    & ~' b) Z/ [5 i  s+ |6 ~
  247. <font color="#000000" face="Tahoma" size="3">static void OnTxDone(void)</font>
    ' l3 \* v% s& g9 b/ _5 h3 V, A5 x
  248. <font color="#000000" face="Tahoma" size="3">{</font>
    ; {+ }: R1 e" z' n
  249. <font color="#000000" face="Tahoma" size="3">  /* USER CODE BEGIN OnTxDone */</font>
    . x. ?8 O5 a/ g+ p& i
  250. <font color="#000000" face="Tahoma" size="3">        APP_LOG(TS_ON, VLEVEL_L, "OnTxDone\n\r");</font>/ A% j5 e4 s' P1 X( i$ L
  251. <font color="#000000" face="Tahoma" size="3">  /* Update the State of the FSM*/</font>9 }1 M( l* K( R1 k) s/ D) G/ @
  252. <font color="#000000" face="Tahoma" size="3">  State = TX;</font>
    ) F7 N8 Y. g6 b  A4 F
  253. <font color="#000000" face="Tahoma" size="3">  /* Run PingPong process in background*/</font>
    0 \8 C( h8 v  L( u8 J% }9 B* G
  254. <font color="#000000" face="Tahoma" size="3">  UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_SubGHz_Phy_App_Process), CFG_SEQ_Prio_0);</font>) y) M% D, C, q# n& V, y
  255. <font color="#000000" face="Tahoma" size="3">  /* USER CODE END OnTxDone */</font>
    " E& v0 f2 K' m) N) x
  256. <font color="#000000" face="Tahoma" size="3">}</font>/ F0 R6 M. U) L( _! R4 |
  257. ! ?" d2 K- ~5 K/ L" u) y
  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>5 k, I7 ^& u' L1 V9 m. }3 _- y& ?% G
  259. <font color="#000000" face="Tahoma" size="3">{</font>. _3 b0 c6 V6 _# J
  260. <font color="#000000" face="Tahoma" size="3">  /* USER CODE BEGIN OnRxDone */</font>% [- n3 h$ l' D( y# y% r* z
  261. <font color="#000000" face="Tahoma" size="3">        APP_LOG(TS_ON, VLEVEL_L, "OnRxDone\n\r");</font>4 f/ L8 I! Z" _0 g" P" g
  262. <font color="#000000" face="Tahoma" size="3">#if ((USE_MODEM_LORA == 1) && (USE_MODEM_FSK == 0))</font>
    9 i! ]) R, @% o0 U( v# c: j
  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>+ Y7 Y3 f1 T7 l$ P
  264. <font color="#000000" face="Tahoma" size="3">  /* Record payload Signal to noise ratio in Lora*/</font>
    9 ]8 V6 S0 @, o
  265. <font color="#000000" face="Tahoma" size="3">  SnrValue = LoraSnr_FskCfo;</font>$ Z1 l5 B# H7 t5 S
  266. <font color="#000000" face="Tahoma" size="3">#endif /* USE_MODEM_LORA | USE_MODEM_FSK */</font>
    & A0 O' L- t& o. k$ _
  267. <font color="#000000" face="Tahoma" size="3">#if ((USE_MODEM_LORA == 0) && (USE_MODEM_FSK == 1))</font>  g% r( N9 Y* W0 f# m' f
  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>- Q, B! s9 S4 k4 \# e" ~- w) I8 A( {
  269. <font color="#000000" face="Tahoma" size="3">  SnrValue = 0; /*not applicable in GFSK*/</font>) w, {; a, Q/ e' {
  270. <font color="#000000" face="Tahoma" size="3">#endif /* USE_MODEM_LORA | USE_MODEM_FSK */</font>& d. P$ K5 e+ Q' @& q+ ~
  271. <font color="#000000" face="Tahoma" size="3">  /* Update the State of the FSM*/</font>
    ( r% l) O% z3 O3 \" V$ k6 U
  272. <font color="#000000" face="Tahoma" size="3">  State = RX;</font>: [+ W1 N' _. r' f3 v/ ?- B
  273. <font color="#000000" face="Tahoma" size="3">  /* Clear BufferRx*/</font>+ r/ x2 t. M, u+ @; V. U
  274. <font color="#000000" face="Tahoma" size="3">  memset(BufferRx, 0, MAX_APP_BUFFER_SIZE);</font>
    $ s9 v) k+ q5 ^, z/ W8 k
  275. <font color="#000000" face="Tahoma" size="3">  /* Record payload size*/</font>9 D* L. B! a- Y
  276. <font color="#000000" face="Tahoma" size="3">  RxBufferSize = size;</font>$ }) \  P. m! Z0 K# t4 ]6 Q
  277. <font color="#000000" face="Tahoma" size="3">  if (RxBufferSize <= MAX_APP_BUFFER_SIZE)</font>+ S7 R: B% a+ E7 B
  278. <font color="#000000" face="Tahoma" size="3">  {</font>; n; M% n8 V+ ^1 h! L2 \  [
  279. <font color="#000000" face="Tahoma" size="3">    memcpy(BufferRx, payload, RxBufferSize);</font>5 w8 o) H0 _! j- _
  280. <font color="#000000" face="Tahoma" size="3">  }</font>8 K# d1 a9 m8 Q0 c: q3 w2 W6 U3 R
  281. <font color="#000000" face="Tahoma" size="3">  /* Record Received Signal Strength*/</font>
    & \) Y0 R3 }* E" G
  282. <font color="#000000" face="Tahoma" size="3">  RssiValue = rssi;</font>3 d4 e  L( G7 `: v
  283. <font color="#000000" face="Tahoma" size="3">  /* Record payload content*/</font>
    9 K# L& w. h  N& ]3 |& @/ o
  284. <font color="#000000" face="Tahoma" size="3">  APP_LOG(TS_ON, VLEVEL_H, "payload. size=%d \n\r", size);</font>
    8 Z, n  C: c- f. E: ?
  285. <font color="#000000" face="Tahoma" size="3">  for (int i = 0; i < PAYLOAD_LEN; i++)</font>' H/ W! R$ `4 h3 D
  286. <font color="#000000" face="Tahoma" size="3">  {</font>) _5 V4 I8 ?3 z+ B: e
  287. <font color="#000000" face="Tahoma" size="3">    APP_LOG(TS_OFF, VLEVEL_H, "%02X", BufferRx);</font>
    9 {4 _7 Z( i  Y
  288. <font color="#000000" face="Tahoma" size="3">    if (i % 16 == 15)</font>; n9 x7 n  o$ J, [
  289. <font color="#000000" face="Tahoma" size="3">    {</font>
    % d2 K/ x, r* Y' ]0 o( S
  290. <font color="#000000" face="Tahoma" size="3">      APP_LOG(TS_OFF, VLEVEL_H, "\n\r");</font>
    6 i' b# ^+ N/ S% B+ G8 q
  291. <font color="#000000" face="Tahoma" size="3">    }</font>. R- f  C( b% I% d
  292. <font color="#000000" face="Tahoma" size="3">  }</font>9 y/ Q5 d1 @0 |' U
  293. <font color="#000000" face="Tahoma" size="3">  APP_LOG(TS_OFF, VLEVEL_H, "\n\r");</font>
    ! U! u1 z8 O- B/ B, _9 P5 [) s
  294. <font color="#000000" face="Tahoma" size="3">  /* Run PingPong process in background*/</font>: t, E9 ?( ?  w7 P
  295. <font color="#000000" face="Tahoma" size="3">  UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_SubGHz_Phy_App_Process), CFG_SEQ_Prio_0);</font>
    0 d5 O5 j* ]; ?- t
  296. <font color="#000000" face="Tahoma" size="3">  /* USER CODE END OnRxDone */</font>, h+ w5 x# G( W# ]' N
  297. <font color="#000000" face="Tahoma" size="3">}</font>" O; M: r6 U; i: N* y' _3 R& i  J

  298. % g8 `: A9 n4 E7 e6 J
  299. <font color="#000000" face="Tahoma" size="3">static void OnTxTimeout(void)</font>0 P! l3 O) H* L# `) e4 c! l4 e* r
  300. <font color="#000000" face="Tahoma" size="3">{</font>
    7 h# n' D$ z* c! O. `
  301. <font color="#000000" face="Tahoma" size="3">  /* USER CODE BEGIN OnTxTimeout */</font>6 ^& T! @0 O* j7 }  e, C6 y# U
  302. <font color="#000000" face="Tahoma" size="3">        APP_LOG(TS_ON, VLEVEL_L, "OnTxTimeout\n\r");</font>
    : x3 P' k+ _! ^1 L; z7 Y$ `/ C; y
  303. <font color="#000000" face="Tahoma" size="3">  /* Update the State of the FSM*/</font>. h3 F$ T' _0 O6 w9 Q$ j9 I
  304. <font color="#000000" face="Tahoma" size="3">  State = TX_TIMEOUT;</font>$ w7 j- c; y" o5 ]' V
  305. <font color="#000000" face="Tahoma" size="3">  /* Run PingPong process in background*/</font>* v; F" C* _* a: W  `0 |# R$ G
  306. <font color="#000000" face="Tahoma" size="3">  UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_SubGHz_Phy_App_Process), CFG_SEQ_Prio_0);</font>
    . p' i( E. }, |" b
  307. <font color="#000000" face="Tahoma" size="3">  /* USER CODE END OnTxTimeout */</font>: A& w# ?' v! [; r' Y7 w* ~2 y/ V7 D
  308. <font color="#000000" face="Tahoma" size="3">}</font>
    3 Y+ ]! q; R6 [, |

  309. : i& `$ J  N4 a8 V
  310. <font color="#000000" face="Tahoma" size="3">static void OnRxTimeout(void)</font>9 ?8 a9 k5 G* \% ?. E+ i* O0 s
  311. <font color="#000000" face="Tahoma" size="3">{</font>, p& V, P! E; g  Q7 N; X. C
  312. <font color="#000000" face="Tahoma" size="3">  /* USER CODE BEGIN OnRxTimeout */</font>
    1 U) b; G( w5 a6 G) `
  313. <font color="#000000" face="Tahoma" size="3">         APP_LOG(TS_ON, VLEVEL_L, "OnRxTimeout\n\r");</font>! I1 c7 |! w3 x' E
  314. <font color="#000000" face="Tahoma" size="3">  /* Update the State of the FSM*/</font>: m. n- c3 ^! I
  315. <font color="#000000" face="Tahoma" size="3">  State = RX_TIMEOUT;</font># q5 \! R4 B4 n1 `; @, v' B# C
  316. <font color="#000000" face="Tahoma" size="3">  /* Run PingPong process in background*/</font>8 t; z8 ~0 h2 H5 C
  317. <font color="#000000" face="Tahoma" size="3">  UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_SubGHz_Phy_App_Process), CFG_SEQ_Prio_0);</font>6 e$ e, u/ B9 L+ l
  318. <font color="#000000" face="Tahoma" size="3">  /* USER CODE END OnRxTimeout */</font>; t" L, W  r) A) J" G' ?
  319. <font color="#000000" face="Tahoma" size="3">}</font>6 M# h8 y; _- m* U) V8 Y4 E+ n
  320. : h% `& y! \4 U" ]$ ]
  321. <font color="#000000" face="Tahoma" size="3">static void OnRxError(void)</font>
    ! E# T! H( V+ b5 z1 M1 U
  322. <font color="#000000" face="Tahoma" size="3">{</font>& [5 d3 w9 z, _2 m! z% a4 j
  323. <font color="#000000" face="Tahoma" size="3">  /* USER CODE BEGIN OnRxError */</font>( j) K0 b# g# B% l' k
  324. <font color="#000000" face="Tahoma" size="3">        APP_LOG(TS_ON, VLEVEL_L, "OnRxError\n\r");</font>
    ; M7 F3 F+ _. K
  325. <font color="#000000" face="Tahoma" size="3">  /* Update the State of the FSM*/</font>
    % k% j+ H2 V6 A' |# M+ e, |
  326. <font color="#000000" face="Tahoma" size="3">  State = RX_ERROR;</font>  S; V& r' H4 W1 M6 c
  327. <font color="#000000" face="Tahoma" size="3">  /* Run PingPong process in background*/</font>" h+ x. t% a! b% R- g
  328. <font color="#000000" face="Tahoma" size="3">  UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_SubGHz_Phy_App_Process), CFG_SEQ_Prio_0);</font>
    3 F3 u: \0 Q2 h
  329. <font color="#000000" face="Tahoma" size="3">  /* USER CODE END OnRxError */</font>! l8 k: T9 M# q' e
  330. <font color="#000000" face="Tahoma" size="3">}</font>
    : e# f& b% H0 z  P" U3 k, u

  331. ( {) V8 c+ X6 o0 T
  332. <font color="#000000" face="Tahoma" size="3">/* USER CODE BEGIN PrFD */</font>7 B/ B% j2 f9 \. `
  333. <font color="#000000" face="Tahoma" size="3">static void PingPong_Process(void)</font>
    0 o/ e  ?3 P; H* q6 j3 X9 C7 _
  334. <font color="#000000" face="Tahoma" size="3">{</font>
    & u! T" @2 S: u3 p. q
  335. <font color="#000000" face="Tahoma" size="3">  Radio.Sleep();</font>9 V3 Q; a0 \9 V+ e8 k  O* p4 W1 t& o0 E
  336. 8 O7 K* o# H% ]9 g' {" t
  337. <font color="#000000" face="Tahoma" size="3">  switch (State)</font>
    4 V: i5 b0 o+ g0 M
  338. <font color="#000000" face="Tahoma" size="3">  {</font>& G, c0 [# ]2 J: j0 z
  339. <font color="#000000" face="Tahoma" size="3">    case RX:</font>
    ) Y) s9 h* g1 s0 w9 O8 f
  340. 3 g$ r8 P8 E6 b3 S# t9 y
  341. <font color="#000000" face="Tahoma" size="3">      if (isMaster == true)</font>
    1 p* H2 A5 b; P/ l" O
  342. <font color="#000000" face="Tahoma" size="3">      {</font>2 V9 r! \9 O5 |. F& T5 G8 C
  343. <font color="#000000" face="Tahoma" size="3">        if (RxBufferSize > 0)</font>
    2 m+ \+ M0 K+ A$ D$ ^
  344. <font color="#000000" face="Tahoma" size="3">        {</font>
    6 P8 z/ ]) y, c" Y
  345. <font color="#000000" face="Tahoma" size="3">          if (strncmp((const char *)BufferRx, PONG, sizeof(PONG) - 1) == 0)</font>
    8 o1 E/ m; e% u1 i. K+ R0 a
  346. <font color="#000000" face="Tahoma" size="3">          {</font>! L& a. U/ Y6 R) e# |7 N
  347. <font color="#000000" face="Tahoma" size="3">            UTIL_TIMER_Stop(&timerLed);</font>! D0 E) v/ l: m! ?
  348. <font color="#000000" face="Tahoma" size="3">            /* switch off green led */</font>
    9 U7 H+ f0 }/ S8 P0 T
  349. <font color="#000000" face="Tahoma" size="3">            HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_RESET); /* LED_GREEN */</font>
    : f7 ^7 A( e) Q9 h( w2 A* N3 G
  350. <font color="#000000" face="Tahoma" size="3">            /* master toggles red led */</font>* N+ |# E  F" A" t: m
  351. <font color="#000000" face="Tahoma" size="3">            HAL_GPIO_TogglePin(LED3_GPIO_Port, LED3_Pin); /* LED_RED */</font>
    " e9 ^( l' e5 y1 x0 x
  352. <font color="#000000" face="Tahoma" size="3">            /* Add delay between RX and TX */</font>
    2 p0 s1 Q' ~2 Q' w! k# l+ x9 }
  353. <font color="#000000" face="Tahoma" size="3">            HAL_Delay(Radio.GetWakeupTime() + RX_TIME_MARGIN);</font>7 k( k; N0 A* r, K
  354. <font color="#000000" face="Tahoma" size="3">            /* master sends PING*/</font>
    . L  s* A: q3 i. b5 ^9 ]1 Z6 t
  355. <font color="#000000" face="Tahoma" size="3">            APP_LOG(TS_ON, VLEVEL_L, "..."</font>* e3 _8 j5 x$ @; Y" m6 D/ X
  356. <font color="#000000" face="Tahoma" size="3">                    "PING"</font>
    $ d* `4 ]: v' o0 K
  357. <font color="#000000" face="Tahoma" size="3">                    "\n\r");</font>1 B, }  a3 `, ^# F4 @) [. R
  358. <font color="#000000" face="Tahoma" size="3">            APP_LOG(TS_ON, VLEVEL_L, "Master Tx start\n\r");</font>
    % f5 C( }6 u) c2 j8 t3 b3 G9 `
  359. <font color="#000000" face="Tahoma" size="3">            memcpy(BufferTx, PING, sizeof(PING) - 1);</font>
    1 ]8 F1 d9 _; ]6 w5 [
  360. <font color="#000000" face="Tahoma" size="3">            Radio.Send(BufferTx, PAYLOAD_LEN);</font>/ b& `; s! G/ ^9 ?3 E' C# Z
  361. <font color="#000000" face="Tahoma" size="3">          }</font>
    $ l# L: g) _$ s5 M8 u7 d+ N
  362. <font color="#000000" face="Tahoma" size="3">          else if (strncmp((const char *)BufferRx, PING, sizeof(PING) - 1) == 0)</font>
    : I; |1 _9 k  j
  363. <font color="#000000" face="Tahoma" size="3">          {</font>4 `# V7 @4 J  w8 H& l/ H
  364. <font color="#000000" face="Tahoma" size="3">            /* A master already exists then become a slave */</font>( s; D9 ]/ s) q' t! M# q
  365. <font color="#000000" face="Tahoma" size="3">            isMaster = false;</font>( w8 w6 k% v: o  U
  366. <font color="#000000" face="Tahoma" size="3">            APP_LOG(TS_ON, VLEVEL_L, "Slave Rx start\n\r");</font>$ _. y' _  _  Y4 w! P
  367. <font color="#000000" face="Tahoma" size="3">            Radio.Rx(RX_TIMEOUT_VALUE);</font>4 d1 `2 W3 r' @: e: @8 v
  368. <font color="#000000" face="Tahoma" size="3">          }</font>
    ! g# f" e' {; L* _+ \1 N/ Z
  369. <font color="#000000" face="Tahoma" size="3">          else /* valid reception but neither a PING or a PONG message */</font>
    ; U) x6 {6 s% R8 ^
  370. <font color="#000000" face="Tahoma" size="3">          {</font>
    : B, @8 g% `6 F) e) Y
  371. <font color="#000000" face="Tahoma" size="3">            /* Set device as master and start again */</font>' d. `: w* }* E  ~) ^
  372. <font color="#000000" face="Tahoma" size="3">            isMaster = true;</font>
    - z' ]7 i7 S) g) |2 [+ r9 c2 K
  373. <font color="#000000" face="Tahoma" size="3">            APP_LOG(TS_ON, VLEVEL_L, "Master Rx start\n\r");</font>) T0 a' o1 b# W( C  F4 J
  374. <font color="#000000" face="Tahoma" size="3">            Radio.Rx(RX_TIMEOUT_VALUE);</font>' b3 ?. `& Y. Y6 s) C6 ^
  375. <font color="#000000" face="Tahoma" size="3">          }</font>7 Q/ b7 N8 Y) L6 g
  376. <font color="#000000" face="Tahoma" size="3">        }</font>
    $ l5 L% k; G1 G- c% }0 t
  377. <font color="#000000" face="Tahoma" size="3">      }</font>2 S* M( f0 `2 t
  378. <font color="#000000" face="Tahoma" size="3">      else</font>
    9 j+ G, t- \  q) h# X
  379. <font color="#000000" face="Tahoma" size="3">      {</font>* t1 `6 l0 b' o- h
  380. <font color="#000000" face="Tahoma" size="3">        if (RxBufferSize > 0)</font>/ {* @* S! u1 w/ T
  381. <font color="#000000" face="Tahoma" size="3">        {</font>
    - J, C8 c1 W' k$ o% T
  382. <font color="#000000" face="Tahoma" size="3">          if (strncmp((const char *)BufferRx, PING, sizeof(PING) - 1) == 0)</font>
    - ^) S- Q* u+ g7 P6 m+ y$ G
  383. <font color="#000000" face="Tahoma" size="3">          {</font>
    6 H9 y" w6 N4 O- F" M0 O; S
  384. <font color="#000000" face="Tahoma" size="3">            UTIL_TIMER_Stop(&timerLed);</font>
    " @( D' Y+ j* H6 j# l) H
  385. <font color="#000000" face="Tahoma" size="3">            /* switch off red led */</font>/ p% l$ B- u0 E* H& _3 m
  386. <font color="#000000" face="Tahoma" size="3">            HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin, GPIO_PIN_RESET); /* LED_RED */</font>5 h2 f( k6 G( h" T! ?
  387. <font color="#000000" face="Tahoma" size="3">            /* slave toggles green led */</font>6 |1 ?8 l( P5 ~: s
  388. <font color="#000000" face="Tahoma" size="3">            HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin); /* LED_GREEN */</font>
    3 S9 T6 C9 R  m+ x+ F( q
  389. <font color="#000000" face="Tahoma" size="3">            /* Add delay between RX and TX */</font>& t2 o* q; b0 f$ c
  390. <font color="#000000" face="Tahoma" size="3">            HAL_Delay(Radio.GetWakeupTime() + RX_TIME_MARGIN);</font>
    5 [$ \6 }/ _2 B! E
  391. <font color="#000000" face="Tahoma" size="3">            /*slave sends PONG*/</font>- s: r; v* g1 |2 O8 X+ ?( `
  392. <font color="#000000" face="Tahoma" size="3">            APP_LOG(TS_ON, VLEVEL_L, "..."</font>. W5 o+ U$ Z* n3 N9 u6 d
  393. <font color="#000000" face="Tahoma" size="3">                    "PONG"</font>
    , L. c  M8 P2 P( S. }1 ?
  394. <font color="#000000" face="Tahoma" size="3">                    "\n\r");</font>
    ( {( n* H' C, i- u% b% @
  395. <font color="#000000" face="Tahoma" size="3">            APP_LOG(TS_ON, VLEVEL_L, "Slave  Tx start\n\r");</font>3 p* s# {/ L1 x3 F
  396. <font color="#000000" face="Tahoma" size="3">            memcpy(BufferTx, PONG, sizeof(PONG) - 1);</font>: p. [; k5 v9 E: P) _  \5 g6 k
  397. <font color="#000000" face="Tahoma" size="3">            Radio.Send(BufferTx, PAYLOAD_LEN);</font>
    . O1 S# P8 x6 M  ?
  398. <font color="#000000" face="Tahoma" size="3">          }</font>
    / ~- M( Z4 x2 v( N) f
  399. <font color="#000000" face="Tahoma" size="3">          else /* valid reception but not a PING as expected */</font>! a/ u: w* E3 _. n, `2 ]
  400. <font color="#000000" face="Tahoma" size="3">          {</font>
    & A$ I' x" j+ ]; p8 Y, k' H! R& n
  401. <font color="#000000" face="Tahoma" size="3">            /* Set device as master and start again */</font>8 f$ `, [( n6 c+ G" z# ^" A
  402. <font color="#000000" face="Tahoma" size="3">            isMaster = true;</font>
    % I; ~: c5 W! J- W9 ^# D# Z
  403. <font color="#000000" face="Tahoma" size="3">            APP_LOG(TS_ON, VLEVEL_L, "Master Rx start\n\r");</font>
    / l" \% O9 k3 x* v4 Z
  404. <font color="#000000" face="Tahoma" size="3">            Radio.Rx(RX_TIMEOUT_VALUE);</font>4 U* t  c# K# j: W) O. b8 C
  405. <font color="#000000" face="Tahoma" size="3">          }</font>- ^9 O% Z! M& s: K0 s. c
  406. <font color="#000000" face="Tahoma" size="3">        }</font>! b7 R, _4 s/ Y+ t; w: t2 u
  407. <font color="#000000" face="Tahoma" size="3">      }</font>; Z" s1 s( d7 c, L* H5 X
  408. <font color="#000000" face="Tahoma" size="3">      break;</font>
    % x! p" J0 W& Y& {8 z, I
  409. <font color="#000000" face="Tahoma" size="3">    case TX:</font>+ P2 C: o3 X1 ~! d  {
  410. <font color="#000000" face="Tahoma" size="3">      APP_LOG(TS_ON, VLEVEL_L, "Rx start\n\r");</font>
    ) W4 e7 t/ s, u, s% A
  411. <font color="#000000" face="Tahoma" size="3">      Radio.Rx(RX_TIMEOUT_VALUE);</font>
    5 z0 G# Y  \3 a6 j  S. R; E) E
  412. <font color="#000000" face="Tahoma" size="3">      break;</font>9 s# E, k; N3 y* A
  413. <font color="#000000" face="Tahoma" size="3">    case RX_TIMEOUT:</font>) K# n/ e+ r( Y) Z  v7 H. }# |
  414. <font color="#000000" face="Tahoma" size="3">    case RX_ERROR:</font>
    & p8 o! z3 ^) X( Q  Q
  415. <font color="#000000" face="Tahoma" size="3">      if (isMaster == true)</font>
    ; j5 k( o$ n" {. m
  416. <font color="#000000" face="Tahoma" size="3">      {</font>4 p0 O9 D+ g- V
  417. <font color="#000000" face="Tahoma" size="3">        /* Send the next PING frame */</font>
    5 `) F9 u& p9 ^/ g: i) A. c. i
  418. <font color="#000000" face="Tahoma" size="3">        /* Add delay between RX and TX*/</font>5 w' R7 m; f, F  m+ t7 X
  419. <font color="#000000" face="Tahoma" size="3">        /* add random_delay to force sync between boards after some trials*/</font>
    ) s( A* d5 n- H5 v" p9 n4 ^) {& u
  420. <font color="#000000" face="Tahoma" size="3">        HAL_Delay(Radio.GetWakeupTime() + RX_TIME_MARGIN + random_delay);</font>1 n& D2 Z% M2 L& I' z
  421. <font color="#000000" face="Tahoma" size="3">        APP_LOG(TS_ON, VLEVEL_L, "Master Tx start\n\r");</font>$ {. r) v% Z2 f6 c% t- P1 l: V
  422. <font color="#000000" face="Tahoma" size="3">        /* master sends PING*/</font>
    , Y8 z$ ?' ?, B$ A
  423. <font color="#000000" face="Tahoma" size="3">        memcpy(BufferTx, PING, sizeof(PING) - 1);</font>
      v( P5 l, @. L8 a
  424. <font color="#000000" face="Tahoma" size="3">        Radio.Send(BufferTx, PAYLOAD_LEN);</font>: T; _' o3 B9 L& T, b
  425. <font color="#000000" face="Tahoma" size="3">      }</font>
    8 J. X) X$ a- s
  426. <font color="#000000" face="Tahoma" size="3">      else</font>
    9 _/ s/ v: f" y! t& c5 e
  427. <font color="#000000" face="Tahoma" size="3">      {</font>
    ( _2 }( `' e$ O" M2 o* h5 V; o/ h
  428. <font color="#000000" face="Tahoma" size="3">        APP_LOG(TS_ON, VLEVEL_L, "Slave Rx start\n\r");</font>& R, I4 n8 q7 W- n4 U0 g" d
  429. <font color="#000000" face="Tahoma" size="3">        Radio.Rx(RX_TIMEOUT_VALUE);</font>
    ' P: M  l' \6 \/ i) o
  430. <font color="#000000" face="Tahoma" size="3">      }</font>8 W/ A) V6 D& I* g9 U
  431. <font color="#000000" face="Tahoma" size="3">      break;</font>
    $ X7 p& ~% C% C2 b3 @; n# N1 Z
  432. <font color="#000000" face="Tahoma" size="3">    case TX_TIMEOUT:</font>
    ( L; ?/ f9 Q' x! H/ H* k) N( P  w( k
  433. <font color="#000000" face="Tahoma" size="3">      APP_LOG(TS_ON, VLEVEL_L, "Slave Rx start\n\r");</font>
    - v9 L  ^+ t  E9 t
  434. <font color="#000000" face="Tahoma" size="3">      Radio.Rx(RX_TIMEOUT_VALUE);</font>
    3 P3 a9 y$ z" j* L
  435. <font color="#000000" face="Tahoma" size="3">      break;</font>) W6 {5 x2 r$ B3 X$ D
  436. <font color="#000000" face="Tahoma" size="3">    default:</font>7 {* C: o3 w8 ^
  437. <font color="#000000" face="Tahoma" size="3">      break;</font>  a$ A' [" }& Q/ s
  438. <font color="#000000" face="Tahoma" size="3">  }</font>2 F6 x/ e" \4 O! w5 C4 a/ q* I7 Y
  439. <font color="#000000" face="Tahoma" size="3">}</font>1 F$ O& C! `# W
  440. ' j, x. c0 s5 q& O& S' a
  441. <font color="#000000" face="Tahoma" size="3">static void OnledEvent(void *context)</font>
    ! _) k6 F  h  _( h* `0 C
  442. <font color="#000000" face="Tahoma" size="3">{</font>/ K9 \+ P1 G, Q% s$ f4 \* ]
  443. <font color="#000000" face="Tahoma" size="3">  HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin); /* LED_GREEN */</font>+ [, O+ o+ q9 ], }- K( c
  444. <font color="#000000" face="Tahoma" size="3">  HAL_GPIO_TogglePin(LED3_GPIO_Port, LED3_Pin); /* LED_RED */</font>
    ; _! @4 I& F$ z3 l
  445. <font color="#000000" face="Tahoma" size="3">  UTIL_TIMER_Start(&timerLed);</font>
    9 y+ l0 T) y+ \$ D  y
  446. <font color="#000000" face="Tahoma" size="3">}</font>
    6 u7 f; t# {6 B1 B0 J4 X! h
  447. <font color="#000000" face="Tahoma" size="3">/* USER CODE END PrFD */</font>
复制代码

9 ?' e1 v: n& s+ N0 M三、下载测试5 x! `( I+ f) y% Q2 N
最后烧录下载后,正常pingpong通信( t2 l* N8 Z2 U! X
4 O& w" i; }; k0 b
————————————————8 X% @* [7 Z% H/ h! m
版权声明:北世安0 s- |* _3 @/ T3 q2 C3 R, U% V

3 @; `4 B% n, W
5 [% X9 B* l+ G7 H% @' c
f1a0dcf8b9d240c6badd23d0ce95a879.png
e044f5c6d6824fc8b20e93cf9e7fa05e.png
收藏 评论0 发布时间:2022-10-20 18:31

举报

0个回答

所属标签

相似分享

官网相关资源

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