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

使用STM32F103制作的无线下载器

[复制链接]
〃聪聪哥哥 发布时间:2024-12-19 19:00
项目设计的前言:作为一个嵌入式的工程师,在编写代码时候,难免会遇到不同电平之间的转换。例如:RS485通讯方式,RS232,TTL信号,为了查看通讯之间数据的正确性,经常使用到不同的电平转换模块,还需要一个USB转串口工具,将数据上传到PC端,这样我们才能将查看控制器或者是负载返回的数据,为了避免调试代码起来方便,让自己的工作变得整洁,方便我们自己的工作,前端时间正好研究SPI通讯方式的NRF24L01这款无线芯片,利用业余时间做了一个无线通讯模块。在这里分享一下开发的经验。5 _0 T* q5 _+ ?( f9 o$ [7 {: u
2 I5 @. k: D) K  u7 p; U9 g
一:部分原理图设计:
  a# _5 z: i; @+ v( j: C1 K' w' Q! A2 o# `
![12-1.png](data/attachment/forum/202412/19/183819haf0jpwfrbfjj9er.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "12-1.png")' x4 [8 s  i" j
. i4 M/ L9 r, I6 B2 t
二:PCB图展示:+ T; e2 s" x5 |; u  x

9 q) G  ?8 j  c![12-2.png](data/attachment/forum/202412/19/183852j26ztttwzci2cc1t.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "12-2.png")
2 W% i: S+ ]2 d( L+ i; L
0 C* \$ a4 e" e* R) f8 h( f0 W三:软硬件设计的思路:
4 o8 u4 g. S: b$ e7 ?  m8 {/ i: E- c& x7 |6 D
在本次项目中使用主控为STM32F103C8T6芯片,当时使用该块芯片是因为该款芯片具有USB功能,该芯片可以虚拟一个USB的串口进行数据交互,而且封装也比较小,在PCB布局方面比较简单。
6 n/ @  q5 G; i8 \! A) i3 f( I
  G6 A5 l6 M: g, c2 A7 E" I2 b) s无线模块采用的是一款SPI通讯的NRF24L01芯片,在实际的使用过程中比较稳定,可以满足数据之间的交互。7 _/ C; `6 A* j

3 E# l5 e! u# y% ~& Z: m( x; X软件设计思路:利用串口1的引脚的接收发送引脚,使用消息队列的方式,可以将USB下发的的数据发送出去。
2 X6 B+ y1 U; u3 K" `" s+ F0 M
. a3 O9 o1 y, j) a" {- c使用串口2完成与SPI之间的交互,$ n; e, X0 H! s- h
: {: \* V0 ^( M. z
软件配置参数:使用STM32cube MX软件生成USB,SPI,串口底层的驱动部分,这样开发起来也比较容易;
& \6 p1 D& F9 L$ c1 S/ z: X( N4 \* r0 J* s
cube软件配置图如下,主要是对该项目中使用到的引脚进行配置9 O' a, |5 V; o% C

0 V$ @& t% V4 ~% E! |0 B" Y! v4 z7 }![12-4.png](data/attachment/forum/202412/19/184938vzhuojy923nhu3lj.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "12-4.png")7 ?) K0 E( k7 q+ h8 p

$ k* F0 a1 V; L部分软件代码:" q/ h) X3 d4 l3 Z

, `% a  l- |' |3 |  ?' a& {```abc
1 n: w. F3 F# @, a( ]4 L                if(sd == 0)' o* y6 I$ q" v+ t7 p
                {
# r! C+ h+ C4 s- M# i* B% }                        USART_Cmd(USART2, ENABLE);                    //使能串口
& S; o/ i5 f0 B. A% C% C( \                        if(        linecoding_old.bitrate != linecoding.bitrate ||
, j6 M7 z& ]4 U! _* x. c                                        linecoding_old.datatype != linecoding.datatype ||2 U. Z- \$ L7 I
                                        linecoding_old.format != linecoding.format ||% o: K! \, X8 x# I& V8 `% X
                                        linecoding_old.paritytype != linecoding.paritytype ). E' `  V7 @' ^1 ^
                        {1 ~) E8 U- m2 t8 ~
                                if(        usart2_flag == 0 )  u# O. b5 `% h/ H
                                {
+ U% }2 D5 {: }- q7 S8 K4 b/ ^1 Q                                        uart2_config_change(linecoding);
/ i" S3 x2 W3 l$ \: e1 `                                        memcpy((void *)(&linecoding_old),(void *)&linecoding,sizeof(linecoding));
5 @6 M  ]: t! D; u3 q; d) I+ e                                }* s: s/ b' B3 @2 c* b' A
                        }! W7 Q1 F! X: Z# r8 }
                        else if(queue_size(&Qusart2Send) > 0 && usart2_flag == 0)% \! |, a4 }( o6 v6 O
                        {3 P* B* l  \* ?2 ~7 E7 R6 b; ^
                                QueueElementByte data_byte;
! r% O+ C  f# b- |" \# e  r                                usart2_flag = 1;
% M5 M, y" C8 e" r2 @" S) c: R                                if(dequene(&Qusart2Send,&data_byte) == 0 )
( A  @, P' G! [4 b5 B" ~6 g                                {# H2 s8 L/ e  W
                                        USART_SendData(USART2,data_byte.buffer);6 r' M. D5 S" C' P+ Y* z% R
                                }
: G3 ^6 a6 O* M4 k+ l' Z                                USART_ITConfig(USART2, USART_IT_TXE, ENABLE);//开启ENABLE/关闭DISABLE中断
8 t2 S5 _# p- Q' O8 G* y" N                        }& j2 o" }; N2 ^
              4 t: g- `$ q" d0 J+ C# O" x
                        if(GetEPRxStatus(ENDP6) == EP_RX_NAK)
9 a. E. c" c/ w$ k3 Z                        {  h9 G# m7 E% G4 c4 l
                                SetEPRxValid(ENDP6);" D5 [8 ]( v& c# W' }9 h1 h+ l
                        }
% T+ i) ]$ w0 l/ F+ W                        if(GetEPRxStatus(ENDP4) == EP_RX_NAK)# q( r) _' L2 ~6 g  u6 }9 h' q/ C
                        {
" @! X; K2 D4 Q# N                                if(CDC_MAXSIZE - queue_size(&Qusart2Send) >= 64 )4 I/ s9 d$ |1 O
                                        SetEPRxValid(ENDP4);2 v9 H+ c6 j8 n. b( G/ e5 G
                        }6 Y' @; H2 \" k8 P# R

2 I+ b' D5 a  F6 i: G                        if(nrf_state == 0)
/ s' e' {  n% q( ]/ S7 Y) g+ G. Q                                NRF24L01_TxPacket(buffer,1);
5 U. u6 F5 c1 r( ]2 e3 H$ o                }
2 [9 K: _: G; M' M6 v- Q* H                else* X4 o' z8 i, `  [& l2 |, G
                {
. v) `; S6 r: T  Q5 \+ J, d                        USART_Cmd(USART2, DISABLE);                    //失能串口
% f3 W) V) I* r                        if(nrf_state == 0)
7 X* {4 }' C4 u0 v                        {) D/ j9 U" I8 k. p2 D% [4 a* N8 ]
                                if(dap2nrf_Data() == -1)
! l- J! ], l" M0 d7 r                                {* e; Q% e% M2 P3 S& J
                              
# N7 z* C4 h! A' R4 p                                        if(GetEPRxStatus(ENDP6) == EP_RX_NAK)
! i9 V5 _5 x3 |/ o: A: K0 p                                        {( \2 Z# K. j2 X$ `6 q0 F
                                                SetEPRxValid(ENDP6);
! x; s1 w1 ^" a0 `; t& ?: G                                        }7 a3 k1 l: W& ]. B: H8 `
                                `' ]# G) E* n" n4 T
                                        if(        linecoding_old.bitrate != linecoding.bitrate ||  J0 \" k6 m# }) l1 J9 k
                                        linecoding_old.datatype != linecoding.datatype ||; P3 g8 z7 W, m  L" S5 n4 [6 C
                                        linecoding_old.format != linecoding.format ||9 @- p2 ~& c. c% l! c# ]7 S' \$ {; {+ W
                                        linecoding_old.paritytype != linecoding.paritytype        )
$ B) `4 t9 |7 F+ G$ ^                                        {  }8 g0 {7 u. T& E4 p
                                                buffer[0] = 33;//特殊串口设置指令: X8 Y$ L3 h% G2 v  w/ k* \
                                                memcpy((void *)(buffer+1),(void *)&linecoding,sizeof(linecoding));/ O! r6 i: F' N0 F& {' h3 B
                                                NRF24L01_TxPacket(buffer,sizeof(linecoding)+1);
3 a7 `2 M: Y5 n; ^* ^, F                                        }6 u( [; \. y9 w/ A, n* L
                                        else if(queue_size(&Qusart2Send) > 0)% s; Z+ I  n3 G/ P2 x; P/ s
                                        {
: @8 K0 q! z3 L                                                QueueElementByte data_byte;
7 h5 @! x; }) P; ?: L  L" p                                                for(i = 1; i < 32; i ++)& u8 W! C# X8 d' m5 R: n' G
                                                {
2 j  \& ]% Q! e/ \2 e& u  _                                                        if(dequene(&Qusart2Send,&data_byte) == -1 )4 H3 |- \; _1 O/ D* Y' F0 j5 p
                                                                break;
* f$ _; m% d5 L# P( i                                                        buffer = data_byte.buffer;
( `2 E! s0 r/ J( w: u                                                }
  y1 |1 l+ {7 b" i0 w2 `                                                buffer[0] = i - 1;. ?7 f* S1 [' [. \' D- V
                                                NRF24L01_TxPacket(buffer,buffer[0]+1);* }  L/ j& O9 J( l4 K1 B; X2 _  g0 J
                                        }
/ n$ t6 l9 }, J0 U                                        else
1 @+ B+ X. T, a7 C/ D8 \                                        {
) n, y$ L$ u8 Y* ?8 k& `" B                                                if(GetEPRxStatus(ENDP4) == EP_RX_NAK), z' Q8 u$ q0 K! j
                                                {
. e  p1 }. u4 O6 ^7 o+ }* G; s                                                        SetEPRxValid(ENDP4);
, s7 Y: ^* r! m7 t0 _, V                                                }
, B: b. s$ C+ y6 \4 F/ K                                                buffer[0] = 0;; }5 c* O- W8 ^* A! I7 b- Q) }
                                                NRF24L01_TxPacket(buffer,1);  y' ]6 Q' l, T, S1 ^3 U6 J
                                        }
# p: Z4 N6 }) Z, l3 p: e                              0 _' X$ e) d9 V3 ^7 B* q
                                }# N( {1 i2 l: L; w8 G
                        }
$ ^/ D: i+ v) x. {, R. |1 h+ F8 ^                }
& R3 i; S  B. s* P8 K2 O7 R```
! @0 d2 E- X0 ~8 ]
' J- E0 }. ^, F+ s实物使用截图如下:5 K! x6 m# B) U+ T2 i

2 B/ A( w6 o  R9 H+ \3 u![12-6.png](data/attachment/forum/202412/19/185713mjuwqnqnzbnnqznz.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "12-6.png")
. v. t1 D: C& c' a  q7 I5 V8 _. o0 r- Y$ j  q# Y
在实际使用中发现,硬件功耗大概在130ma左右,在数据交互的时候功耗会增加至170ma左右,不过并不影响模块的使用。, C1 D' ?' F% d( f, G

, m2 n  Z3 E( L2 U: ]+ z6 X! K使用该模块的最大好处就是可以让硬件工程师的桌面更加的整洁。1 O! w7 n5 v: e( H. W
0 M* U% b. s( ?' _
硬件设计的时候,设计注意事项:2 b) |1 v2 ?( z/ P4 v1 N
$ z' b( y  r6 _) a7 d  L  D
使用PS7516用作升压芯片,将电池电压3.7V升压至5V,为外设可以提供5v的电压输出。/ x0 j3 \0 }6 |* O  j7 h/ ^

) t! `$ {8 B) j" g1 ]7 gMP2155为降压型LDO,具有可关断功能,当不使用时候,可以使整个系统处于低功耗状态,从而延长电池寿命。
: `9 y: Q4 r' v2 T  Q+ ^! W# Q3 a: o/ _* v# k. C3 }
PW4054为锂电池充电芯片,可使用type-c为电池充电,充电电流由R26取样电阻设定。
6 h) f8 ?) V. X% C  F# I
& [5 m! z" e! i' h. M同时PL5356A芯片为锂电池电压检测芯片,可以显示当前的电池电量,后期将电池电压分压至单片机的ADC内,从而精准的检测电池电压。
' ~; Y/ `% v, m+ W9 W) F* D6 |5 H& b4 Y! V9 B* l' r7 j
在软件开发时候,有以下的注意事项:
9 G' m) O5 ?& h; E
' N7 C: T" M' V: D抗干扰能力:NRF24L01工作在2.4GHz频段,该频段易受到WiFi、蓝牙等设备的干扰。在布局布线时要尽量减少干扰源的影响,并合理设置通信参数以提高抗干扰能力。
  ]% \0 ~+ M# c' Y( O" x# X
! a$ f6 J$ ]% ^4 f) }9 b% {% J功耗管理:在不需要通信时及时将NRF24L01置于待机模式或掉电模式以降低功耗。$ R7 M8 `: s' f3 [

5 R& Y/ B9 |0 j3 v3 ]( \距离与障碍物:无线通信距离受环境因素影响较大,障碍物会严重影响通信质量。在实际应用中要考虑通信距离和障碍物的影响并采取相应的措施。
; Y! K" q; [+ ]' L- L9 H7 y4 R
; a) T0 e; `+ C& A! l/ nNRF24L01的开发过程需要仔细规划硬件连接、合理配置软件参数、掌握调试技巧并关注实际应用中的注意事项。通过不断的实践和总结可以逐渐提高开发效率和应用效果。
5 R6 k* O1 F# s: C( M) e, ^( v' ^* L4 _
原理图见附件:
  N  E/ T- ]& I0 \. _/ V( a, ?; s+ P1 R" W3 z; h& F
![PDF.pdf](data/attachment/forum/?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "PDF.pdf")& Y( b/ g/ u: E+ e4 s/ G
6 i+ n/ o/ m, f8 h0 |
12-1.png
12-4.png
1.jpg
1.jpg
赞 收藏 评论1 发布时间:2024-12-19 19:00

举报

1个回答
〃聪聪哥哥 回答时间:2024-12-25 16:51:39
( Q/ e- r2 ]: J. t2 R
重新上传一下 原理图!!!
1 [1 D  j  ]3 }, e0 ^8 [2 E& d 无线下载器原理图.pdf (1.56 MB, 下载次数: 2)

所属标签

相似技术帖

官网相关资源

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