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

NUCLEO_L552ZE_Q 『人生中的首块STM32L552开发板』┅ nRF24L01双机...

[复制链接]
三界狗 发布时间:2020-3-26 00:14
上回在NUCLEO_L552ZE_Q_STM32Nucleo_144 开发板上测试了外部中断的使用,本想着这回来一篇有关TrustZone的文章,毕竟这才是Cortex-M33的重要的内容,于是花了些时间去研究,然而现实总是那么残酷,在这碰了壁,自己建立的工程下载进去之后没有反应,就想着先去看看官方给的GPIO_IOToggle_TrustZone例程,按照说明文件里的步骤下载到开发板上,结果还是没有任何反应,我也是一头雾水,在网上也找不到任何有关的资料,说明文档是英文的,看得也是一知半解的,所以就没弄成,还是决定先放在一边吧,不能被这个耽搁了。恰好手上有两个nRF24L01P模块,还有两块stm32f103c8t6小板子,于是就鼓捣了一下使用它们来做个无线通信测试,下面就请跟随我进入正题吧。' N8 }  `- V) _9 y6 U$ n; V
评测内容:
( u* H: E; I* ?8 P! s1、使用STM32F103C8T6系统板连接nRF24L01P作为主机发送一固定长度字符串,NUCLEO_L552ZE_Q_STM32Nucleo_144 开发板的板载SPI通信接口连接nRF24L01P作为从机接收,并且通过uart串口将接收到的数据发送到PC上位机显示,使用板载LED指示发送和接收状态。
- i4 h* \" X1 [9 o所需元件:
+ G+ g, B- z, M1、NUCLEO_L552ZE_Q_STM32Nucleo_144 开发板*1' O" S, ^3 u1 {& L0 X- j  J
2、STM32F103C8T6系统板*1;
* _) b3 @1 J# u  Q$ L3 e+ o3、nRF24L01P模块*2;
: n2 x9 K5 w+ i" H- K/ d$ D: ?. Z2、板载红色LED;: k6 }4 q$ E' ]! p1 b
8 N$ G; n- ?- }' R% d& `
评测步骤:9 v3 F! m  f7 }* e
1、新建工程:
' Z+ s) Z& A+ {8 K% @1 p本次测评我使用STM32CubeMX的开发板模板进行工程创建,针对NUCLEO_L552ZE_Q_STM32Nucleo_144 开发板上的板载硬件已经默认帮配置好了,只需要根据自己的需求配置SPI接口便可以了,按照如下步骤便可创建一个开发板的默认配置工程;
3 d: f* v$ B0 B3 B( a- d
1-1.png
2 O8 C8 T8 \  v4 H: p. |; c; b
1-2.png

8 y$ b1 l: E8 _+ S* f1 y: y2、配置SPI接口:
) x  [- R0 f! @$ L, A; M根据下图配置将SPI接口设置好,SPI接口使用的是开发板上的CN7排座的SPI_A接口,在STM32CubeMX上SPI1的默认SCK引脚在PA1上,我根据开发板的原理图将其改到了PA5,需要注意的是,nRF24L01P的IRQ引脚需要设置成上拉输入模式;
8 h4 C! P- a( X6 S( M
1-3.png
% |/ Q# ^- P- B7 a
nRF24L01P的SPI接口
9 ~$ s+ |+ V$ b3 w) g) A% V# e
1-4.png
. H! @- O- F. v- C1 [# D) Y
SPI配置选项

* F- I: N: {$ A3 L5 _# X- {
1-5.png
. \/ N& [# P) l( q7 e. w  q
开发板接口原理图

( V: @* w& ^. w; A+ p3、设置串口波特率:
. [7 d+ q2 Q4 ?7 X2 v8 F3 {开发板上与STLink虚拟串口连接使用的是LPUART1,工程创建的时候已经默认配置好了,使用PG7和PG8两个引脚,波特率为209700Bits/s,这个波特率不是我想要的,所以将它改成了921600Bits/s;
# j) x1 G2 M0 }6 Y' @" P& S
3-1.png
4 B' P5 B* o& ?" p0 d0 `5 k
4、保存工程:7 f7 T- y( ~: H1 i: X  v
保存好配置工程并且生成MDK_v5工程;. p0 [0 f5 I& K4 K. }
4-1.png

. i7 N0 i* V/ q5 _4 N% u; T4 C8 W5、测试串口的工作情况:
8 E1 _( f4 l) s+ o2 y% P因为不能保证nRF24L01P能够顺利的工作,因此我是先测试串口能够正常工作之后再考虑加入nRF24L01P;这也是一种调试代码的技巧,一点点来,不然什么东西都一下子加上,调试的时候出问题就会不清楚问题的出处具体是在哪里;
' v# t5 W$ W; ~4 Z1 K3 M在这里,又再一次体现出了HAL库强大的封装工艺了,在标准库函数上要实现发送一个字符串,需要自己调用串口发送字符的函数来循环实现发送字符串的函数,而在HAL库上,只需要一个函数,不管是发送字符还是发送字符串,统统都能搞定。
9 p* z: `' @1 U$ I# }/ Q5 Z就像以前学习串口通信的时候发送Hello World一样,添加如下代码到main函数的循环里,7 X- x1 r. g+ b, p6 y
  1. HAL_UART_Transmit(&hlpuart1, "Hello World !!!\r\n", 17, 100);
    & X% Z) k+ J" S' v% q% Z& ?# U
  2. HAL_Delay(500);
复制代码
将代码编译连接通过后下载到开发板上,按下开发板右下角的复位键后,便能在串口助手上看到如下打印的信息,说明串口工作正常;
3 s7 F* _' Y, @$ w3 M
5-1.png

2 i( h& L  |  F: c# F" k6、添加nRF24L01P相关的代码:2 Y4 g3 @- @% q! R0 P0 I$ V
nRF24L01P的代码我使用的是购买该模块的时候官方提供的测试模板,模块使用的是泽耀科技生产的挪威原装芯片nRF24L01P模块,不是黑色PCB板那种,但应该都是通用的,接口也是一样的,已经成功在我的STM32F103C8T6系统板上正常收发了,代码我会在末尾的附件中给出,1 E8 K/ [  e( S- a7 |
复制模板的nRF24L01P源代码和头文件到本工程中并添加到工程里;4 h3 y" m& E- j* _+ F
6-1.png
- G( q0 s  R" h( j7 i
由于使用的环境不一样,需要做一点修改,首先是引脚宏定义,在nRF24L01P.h文件的开头添加#include "main.h",并且将不需要的头文件包含去掉nRF24L01P.h文中定义了模块的CSN、CE、IRQ三个接口的引脚,改成如下;
4 \9 H" V( n* Z5 X# u8 V+ P3 u
  1. /** RF24L01硬件接口定义 */
    5 X' ?  L2 o7 g7 M' l5 `
  2. #define RF24L01_CE_GPIO_PORT                        GPIOD1 ]. W$ a  ^$ D, I; x" W3 V5 R
  3. #define RF24L01_CE_GPIO_PIN                                GPIO_PIN_15
    # m' a" x; ]( ]; n% J1 x0 a

  4. 3 U9 }8 H2 \, D% [% u! v
  5. #define RF24L01_CS_GPIO_PORT                        GPIOD
    ' K. ~$ e8 G/ z" H$ R1 M, @5 ]2 E
  6. #define RF24L01_CS_GPIO_PIN                                GPIO_PIN_14
    ) E# u8 c& y8 I, ?( V# c

  7. ! }6 W5 R0 h( x2 Z. c3 P7 D
  8. #define RF24L01_IRQ_GPIO_PORT                        GPIOF0 i  k/ [2 V: I# g, d
  9. #define RF24L01_IRQ_GPIO_PIN                        GPIO_PIN_12
复制代码
然后是nRF24L01P.c文件中的延时函数,替换成HAL库的延时函数,并且注释掉500Ms的延时函数(HAL库的延时函数能够延时500ms以上),相应的调用延时函数的地方再做点修改;
+ d* X( f8 g( c
  1. /**
    3 y0 o& p. @- J! c* b' o
  2.   * @brief :NRF24L01 延时(Ms): R3 p5 h  R2 G" G/ u0 Z7 U
  3.   * @param :
    : p3 ^0 P; G; i( g/ Y7 m4 R
  4.            @TxByte:延时的Ms数
    * H" X" ~; H2 U! O4 n5 w
  5.   * @note  :不超过2^32。5 M. @3 a6 x& Y% A' T
  6.   * @retval:无
    - K& D4 f4 i$ M$ K
  7.   */; @/ S- \  Z7 `$ k0 g+ \$ `- b, v
  8. static void NRF24L01_delay_ms(uint32_t Ms)
    2 W2 M! H7 i  Q& i+ y. h. ~
  9. {
    8 a# z- N* a5 ^% f& s( o
  10.         HAL_Delay(Ms);4 j6 `( v9 x9 f0 ^+ Y
  11. }0 n5 q7 I! y8 G* D

  12. * G  k6 R: M2 E5 w5 [" a( d
  13. /**
    $ U3 ^/ m" r  d- e2 p
  14.   * @brief :NRF24L01 延时(500Ms)0 V. K6 q* g2 x2 W# u, u
  15.   * @param :+ p+ }$ T6 d1 K6 Z
  16.            @Ms_500:延时的500Ms倍数* q* n" p1 o0 h/ i) p6 r
  17.   * @note  :不超过255。
    2 V0 R6 x2 o4 D) i9 l
  18.   * @retval:无
    0 W- k5 t* L0 g3 V0 I! f
  19.   */
    9 }  f; }0 {# w1 O2 `6 l) k9 }1 B
  20. //static void NRF24L01_delay_500ms(uint8_t Ms_500)  ~) V% G) s3 {% s4 [# f- O- G
  21. //{
    3 T8 h' L: O! R1 j* B; e
  22. //        drv_delay_500Ms(Ms_500);
    , P0 H' {+ T  X, R) Q& j
  23. //}
复制代码

( `' X8 ?) W- d接下来是将SPI读写函数替换HAL库的SPI读写函数,在这里又再一次凸显出了HAL库的那个简单易用的优点;, N: t) O. M6 B4 C, `
  1. /**# g4 S3 c6 L( i6 A
  2.   * @brief :NRF24L01 SPI收发一个字节; V5 ?$ p: b% e! K) Z- Q  K2 Y
  3.   * @param :+ K2 z3 f9 e+ B% {
  4.            @TxByte:发送的数据字节
    * e" j$ B9 h1 M3 H/ ~
  5.   * @note  :接口函数,方便移植。
    ! u- C+ _( x. m& k1 b
  6.   * @retval:读取的数据+ {% T3 P  v8 Y! p
  7.   */0 X0 S. F4 T( T$ h+ @- c6 V  p# b
  8. static uint8_t nRF24L01_SPI_RW_Byte( uint8_t TxByte )( s8 H$ }0 ~9 n* o
  9. {
    % C6 ]! r8 w: L8 `0 M6 b
  10.         uint8_t RxByte;" T+ y- J6 h  {8 V; p: b# V
  11.         4 r$ ]8 R2 ~* k
  12.         HAL_SPI_TransmitReceive(&hspi1, &TxByte, &RxByte, 1, 100);
    ' ^- F" H# L+ p3 ]7 [* }2 u; `3 s
  13.        
    - z" j$ f. y' V
  14.         return RxByte;
    - o, A. R6 X' X; W' F! L
  15. }
复制代码
再接下来,nRF24L01P.c文件实现了nrf24L01P使用到的GPIO口的初始化函数NRF24L01_Gpio_Init,由于使用的固件库不一样,且main.c文件中已经统一初始化了,所以就将该函数的内容注释掉,并且注释掉所有调用的地方。编译工程,没有问题说明移植成功。( _! |( X, J' R* A/ v% ?
7、编写代码实现无线接收功能:nRF24L01P.h包含到main.c文件中,在文件开头定义一个用于接收数据的数组;" x( ~; L  i! f( o. i, c
  1. uint8_t g_RF24L01RxBuffer[ 32 ] = { 0 };
复制代码

9 `% X' q+ n8 Q$ o% Z  t) \7 ]. Q; v在main函数中添加如下代码,实现nRF24L01P的无线接收功能7 W8 X2 C& t' p: A# Y
  1. uint8_t i;
    . {$ k6 `% {7 R
  2.        
    6 k  a+ C6 V0 E( p7 g& Z
  3.   /* USER CODE BEGIN 1 */
    % |3 f" k# Z7 n% |* l

  4. # `8 A9 X$ A% l4 l
  5.   /* USER CODE END 1 */+ k! v  o; u' e" |4 U; }6 T

  6. 8 t2 V( p+ Q5 \. ^4 J! A
  7.   /* MCU Configuration--------------------------------------------------------*/% [1 H; \* W: c+ f

  8. 5 [0 _! U- I6 T! d3 \0 q, }3 v0 M1 @
  9.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    : J6 @/ u9 V. F1 h% ~8 a7 Z0 t
  10.   HAL_Init();' j  i" E2 w' Z; i7 t( ^1 K  e" ~

  11. 5 H  M' K  Q3 f* k; H7 ~9 Q
  12.   /* USER CODE BEGIN Init */
    # Y( H0 k3 \! b( Y0 Q7 Z
  13. " t. Y+ G: Z9 }) N: q+ K# v
  14.   /* USER CODE END Init */* r$ y& a! ^0 n: t: F% q: L

  15. 0 g7 ~+ `; l3 S; L* B
  16.   /* Configure the system clock */1 Q: l+ r$ g2 T
  17.   SystemClock_Config();
      H0 N0 [  U/ Z/ v0 a
  18. ! q$ {9 M# b2 `0 L+ h6 X" `2 o
  19.   /* USER CODE BEGIN SysInit */
      F4 ?' T( x* y$ z" Q+ T# Z" S1 W
  20. - X: s6 w0 y  B/ r8 u, k9 Y) q
  21.   /* USER CODE END SysInit */3 w2 u4 d2 e& N7 I

  22.   n3 J. i$ k( J8 r0 E/ |
  23.   /* Initialize all configured peripherals *// f6 E9 U- x  a& |6 r8 G/ `- b
  24.   MX_GPIO_Init();
    " i. O% W/ R; O" @
  25.   MX_ADC1_Init();6 `& ]6 |; z2 W
  26.   MX_LPUART1_UART_Init();( x4 r+ m! c, M: a
  27.   MX_RTC_Init();; U# y5 q, r& [% x
  28.   MX_SPI1_Init();4 U' m8 A+ A, y2 t
  29.   MX_UCPD1_Init();
    3 C7 y( Y4 Z9 U: {! k
  30.   MX_USB_PCD_Init();
    ! _: j% T# X! \9 U7 j. {& u7 U! P
  31.   /* USER CODE BEGIN 2 */  Y3 m1 f  @1 ?
  32.         NRF24L01_check( );                        //检测nRF24L01P是否已连接
      U+ G) T0 T1 @  q
  33.         RF24L01_Init( );                                //初始化nRF24L01P3 d$ ?0 Q% z4 Q
  34.         / u2 R# l" o) D, q4 W8 E) l1 Z
  35.         HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, GPIO_PIN_RESET);, P5 A, v5 w" y/ g4 e, u/ U
  36.         for( i = 0; i < 6; i++ ), R0 j) }& }, p/ ^# X" g6 M
  37.         {
    8 I: _: V0 Y% A- w( Z* e' m6 ?* m
  38.                 HAL_GPIO_TogglePin(LED_RED_GPIO_Port, LED_RED_Pin);
    * j- C' ^3 q$ M  I) m2 q
  39.                 HAL_Delay( 500 );
    - \" b8 N6 N  @& p. l
  40.         }  I$ l7 |/ ^+ P3 }
  41.         # l* O: P3 k( s7 t. B# E% V
  42.         RF24L01_Set_Mode( MODE_RX );                //接收模式
    7 x" v' s: C& e9 h# {( R
  43.   /* USER CODE END 2 */- i' Y" i' d& F3 P' Z+ n: H# C+ ~

  44. 4 \  m% t+ K" w
  45.   /* Infinite loop */9 Z) |0 q* a: t( r8 s
  46.   /* USER CODE BEGIN WHILE */
    ; f7 A; C5 B/ K+ q
  47.   while (1)$ K5 {! m6 _% a" k% C
  48.   {' `6 G+ y  q+ b  r  U
  49.     /* USER CODE END WHILE */
      W+ B5 f2 [; U& ?* |

  50. 7 g6 Z. M* F1 }$ Z( w+ p
  51.     /* USER CODE BEGIN 3 */! R+ R" p) |& t

  52. * n7 R: }" N3 L- I, j
  53.                 i = NRF24L01_RxPacket( g_RF24L01RxBuffer );                //接收字节
    0 y% r+ n# @9 Y4 r  z/ O
  54.                 if( 0 != i )
    ' }/ q4 G2 O' \+ y6 M) \
  55.                 {& b: J$ a" T- |+ D
  56.                         HAL_GPIO_TogglePin(LED_RED_GPIO_Port, LED_RED_Pin);  h0 f5 l7 Z0 y# t. w% S9 i
  57.                         HAL_UART_Transmit(&hlpuart1, g_RF24L01RxBuffer, i, 100);                        + J: O2 q) x1 h
  58.                 }
    2 l2 r  Q$ ?$ J
  59.   }" K6 }2 J& a& i$ x* r2 g% X$ @" H" R
  60.   /* USER CODE END 3 */
复制代码
8、运行结果:代码编译通过,烧录至开发板上,按下右下角的复位键,程序开始运行。发送端我使用的是官方测试模板小改动后在STM32F103C8T6系统板上实现的,在此就不详细阐述了,有需要可下载附件做参考。发送端和接收端都运行起来后,串口助手上也开始打印接收到的数据了;
  T0 m% J% t7 i5 ~
8-1.png
! V7 q$ w) A2 m1 X3 O+ m1 M6 z
8-2.gif

% N  q3 _& X5 r6 X  m* _% C总结:
7 y3 B# `; W5 C4 i2 C' D4 M* ^$ \nRF24L01对我来说是个噩梦,为了能够发挥NRF24L01P的最远传输距离,曾经一点点啃英文数据手册应用在51单片机上(黑色小模块给的例程都是NRF24L01而不是NRF24L01P的,前者的传输距离较短,后者的资料有点少),前些天为了将原先51单片机上程序移植到STM32上,荒废了几天时间,还是无法发送数据,气得我直接将模块给废了,然后就遇到了这款红色版的模块,例程和资料都可以再公司官网上下载到,很详细靠谱。7 q% U' N5 F# o; R1 S5 V
NUCLEO_L552ZE_Q_STM32Nucleo_144 开发板的SPI和UART串口评测就这些,简单来说,使用HAL库来开发的代码确实要简单很多,开发板上的STLink还提供有虚拟串口,并且将SPI接口也都在一个地方引出来了,对于接线来说很方便。OK,有关nRF24L01P的细节东西比较多,有些地方没有阐述清楚的,欢迎在评论区指出。" f0 P3 f% W! S9 `: Y8 H
7 d) s) B, j+ d5 ^0 F) V: U& B

3 L' f; l( F1 n5 ]* e$ x# F; X/ M
' b4 ]/ m" ?) Q* \+ R: R

- j* u2 w; p' ` nRF24L01P_TX.zip (4.45 MB, 下载次数: 2)
收藏 评论0 发布时间:2020-3-26 00:14

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版