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

使用STM32F103制作的无线下载器

[复制链接]
〃聪聪哥哥 发布时间:2024-12-19 19:00
项目设计的前言:作为一个嵌入式的工程师,在编写代码时候,难免会遇到不同电平之间的转换。例如:RS485通讯方式,RS232,TTL信号,为了查看通讯之间数据的正确性,经常使用到不同的电平转换模块,还需要一个USB转串口工具,将数据上传到PC端,这样我们才能将查看控制器或者是负载返回的数据,为了避免调试代码起来方便,让自己的工作变得整洁,方便我们自己的工作,前端时间正好研究SPI通讯方式的NRF24L01这款无线芯片,利用业余时间做了一个无线通讯模块。在这里分享一下开发的经验。* }5 I: [- W! X5 U1 w4 f: ]

1 T! K) \/ j9 U3 B) P一:部分原理图设计:
( ^+ k7 Q  R$ a# h6 w  d/ l& ^; l% C0 g& a" y
![12-1.png](data/attachment/forum/202412/19/183819haf0jpwfrbfjj9er.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "12-1.png")! r( k" c( B# Z+ ^( m% h
) _+ y0 n- ^5 u1 F  Z5 _
二:PCB图展示:
9 @2 g- p- H1 `+ E- k: [, [9 A* L# E8 p) v2 o( w4 l
![12-2.png](data/attachment/forum/202412/19/183852j26ztttwzci2cc1t.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "12-2.png")
5 ~' D! Q: \) c# P4 J; z! X1 W4 w" S: z/ l6 L
三:软硬件设计的思路:
8 B* F' Y$ v5 Y# ?* @" [" }7 ?' M& s6 I, C1 P# T
在本次项目中使用主控为STM32F103C8T6芯片,当时使用该块芯片是因为该款芯片具有USB功能,该芯片可以虚拟一个USB的串口进行数据交互,而且封装也比较小,在PCB布局方面比较简单。
/ G& i$ h& o: ^4 f) D! Z' F  ]% V, o  k& }' @8 l  |, t: S
无线模块采用的是一款SPI通讯的NRF24L01芯片,在实际的使用过程中比较稳定,可以满足数据之间的交互。
- w, o2 f! F; E8 K* H( Y& s0 F) S7 q
% V# u( B" J0 S软件设计思路:利用串口1的引脚的接收发送引脚,使用消息队列的方式,可以将USB下发的的数据发送出去。
6 `' a& c5 F; I5 d/ M- T
( S: f% p+ y) ~! L9 t  e使用串口2完成与SPI之间的交互,
+ ^9 Z+ L9 g) s* g, v3 N
& A- k! l8 f0 G* E" C; D4 F软件配置参数:使用STM32cube MX软件生成USB,SPI,串口底层的驱动部分,这样开发起来也比较容易;5 J! N( L, o5 w9 r9 Y# ?" S8 V$ z7 I
- u8 ?! x+ I. _# Q& m% ~5 o* l
cube软件配置图如下,主要是对该项目中使用到的引脚进行配置- ]+ L5 N4 N& H5 J8 ~, h9 o3 v

8 ^- U6 _' k% N: D) X![12-4.png](data/attachment/forum/202412/19/184938vzhuojy923nhu3lj.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "12-4.png")
7 U, o% t: O" m. j# k; X3 h' D: s/ c
部分软件代码:
1 s( T' z  l. s% M
) b- C8 b4 l$ p. m) R3 C3 f```abc/ I0 o* B- e0 x+ k! X
                if(sd == 0). ^: k# w" w/ x8 j) v
                {
! e# X/ ]& Z0 _. a( V% j                        USART_Cmd(USART2, ENABLE);                    //使能串口
1 Y  ]$ ]% O$ C/ h+ W) |! x                        if(        linecoding_old.bitrate != linecoding.bitrate ||9 W' S; O- a3 b' P
                                        linecoding_old.datatype != linecoding.datatype ||, L! i( S: `; g" v3 W$ j( R
                                        linecoding_old.format != linecoding.format ||& ]1 J  s& I. v3 P( A: i( `3 }7 J
                                        linecoding_old.paritytype != linecoding.paritytype )7 [6 e/ E; S5 `/ N% o7 v7 b3 ~
                        {
, p& y$ l8 q" d$ f% n2 ]# ~# i1 ?                                if(        usart2_flag == 0 )
, d' m4 Z: g7 S: h5 t1 }3 h                                {
/ |0 @4 N! d& W6 a                                        uart2_config_change(linecoding);- ~% g( {$ N( Y& K# @
                                        memcpy((void *)(&linecoding_old),(void *)&linecoding,sizeof(linecoding));) r' g% N  t, m5 o" U( r6 A
                                }
# e+ N- A7 r# T# g% g: |$ I                        }
8 K$ Z* u* Y* S7 k+ L" [6 s                        else if(queue_size(&Qusart2Send) > 0 && usart2_flag == 0)
3 R- v7 d" _$ K8 ~' z9 {% N0 R                        {3 k! Q8 k6 u" v7 \& ~
                                QueueElementByte data_byte;
; @& x$ M2 \; H+ V) T5 N! o! t0 D                                usart2_flag = 1;6 m7 D; ~( s5 O# N+ P3 I5 Y: B
                                if(dequene(&Qusart2Send,&data_byte) == 0 )+ E  I. L0 m4 ~" T2 X
                                {4 n% f+ z- n5 a: _
                                        USART_SendData(USART2,data_byte.buffer);9 y* N: P+ C% p) Z6 d$ y8 P; d
                                }/ r0 L$ P8 q* P/ H
                                USART_ITConfig(USART2, USART_IT_TXE, ENABLE);//开启ENABLE/关闭DISABLE中断. q. B" x8 [2 r- _% I' L
                        }
. W2 f" U/ U. V# S' F8 S' r  `9 z- S1 q              $ n0 l# {$ T& L; W% u' |
                        if(GetEPRxStatus(ENDP6) == EP_RX_NAK)
5 E" F! W3 w: R& U% Q3 c                        {! q$ \+ a! Q# d" z' @: b
                                SetEPRxValid(ENDP6);
2 o5 |' v: e# D                        }6 z& u- |1 t3 Z1 |
                        if(GetEPRxStatus(ENDP4) == EP_RX_NAK)
6 w# K; \7 E7 e4 w+ o4 t1 q5 N7 A                        {
0 I# e+ o0 h9 H; Z7 e5 v                                if(CDC_MAXSIZE - queue_size(&Qusart2Send) >= 64 )0 q! \- A/ W. F# j- f5 Q
                                        SetEPRxValid(ENDP4);8 L/ K/ p9 e* E+ K& d6 |
                        }' {; A% c0 W9 _+ x! ]) [
0 ]" x# M" x) J8 M( I0 h4 P" H
                        if(nrf_state == 0)
8 ]$ v2 c3 I% D/ {0 F+ \3 q                                NRF24L01_TxPacket(buffer,1);+ C' l6 @/ K& i5 }' |
                }. J% R0 o) v; y* l; j
                else
. {& B" i  {9 M7 U6 }1 h% m                {* N0 q/ z3 A0 `% Y0 a! X: @) K
                        USART_Cmd(USART2, DISABLE);                    //失能串口
% ~, w9 Z- P5 `# V4 Q                        if(nrf_state == 0)
8 M( \% ?! u8 V                        {
  D) D: s/ X, n/ I2 L                                if(dap2nrf_Data() == -1)
4 g  t( e! B, T9 P, ]' e/ H                                {
  X5 m' O, H* |: C: z5 P  `                              
3 _/ D! v; c' c9 H2 y, i8 i: l                                        if(GetEPRxStatus(ENDP6) == EP_RX_NAK)
' `% p9 z# L# E                                        {
8 W) r1 R/ H# s                                                SetEPRxValid(ENDP6);! k: z. M% r3 R  l% y/ O
                                        }  D  g2 z) Y- d, x, m; g
                                ^2 U- ?& p: R, m5 @# b
                                        if(        linecoding_old.bitrate != linecoding.bitrate ||5 [( Q5 U. b: |3 @+ F
                                        linecoding_old.datatype != linecoding.datatype ||. j9 Z$ Y/ G+ m+ A6 k' r
                                        linecoding_old.format != linecoding.format ||
( f0 @1 m: T# D$ `2 O                                        linecoding_old.paritytype != linecoding.paritytype        )( h+ d: ^  ^" k4 L( i
                                        {
/ u: K, I; e8 F% v: r9 V0 H& n                                                buffer[0] = 33;//特殊串口设置指令3 B9 c  m9 E, c6 {! u
                                                memcpy((void *)(buffer+1),(void *)&linecoding,sizeof(linecoding));
, O; o* x, c7 R+ ~0 `% g* u                                                NRF24L01_TxPacket(buffer,sizeof(linecoding)+1);7 {+ x# G  m3 ~7 ~6 G
                                        }, m  e9 p" w( S: h% k9 ^
                                        else if(queue_size(&Qusart2Send) > 0)
1 S$ Y4 q' X8 E+ C3 T5 s% s                                        {
& n- O" d' u; w6 V                                                QueueElementByte data_byte;
8 J; Q; H, S. Q  v" x                                                for(i = 1; i < 32; i ++)% Z- B; r) m' i- Z
                                                {
! g" r, N( J1 [+ n. [                                                        if(dequene(&Qusart2Send,&data_byte) == -1 )* P' J! p* G" H6 G
                                                                break;) y5 c. ~$ `" p' V. y
                                                        buffer = data_byte.buffer;$ Z* M  `  r$ M9 A, ?& r2 n
                                                }& H% g% r9 F$ R- i+ n
                                                buffer[0] = i - 1;" }5 J2 g5 T% n# U+ E* m/ U2 n
                                                NRF24L01_TxPacket(buffer,buffer[0]+1);
/ W$ C' w9 h2 p) d1 _" n5 j                                        }7 o, b1 Z. y/ m8 ]
                                        else
: u0 z% B' d4 t) n$ ?; P5 Z+ W                                        {6 e( e- u1 M5 b! ?: ?
                                                if(GetEPRxStatus(ENDP4) == EP_RX_NAK)
4 _3 Y7 o" {0 d4 @1 D- w                                                {
3 K0 F* n' e! v                                                        SetEPRxValid(ENDP4);; b1 c) T6 D' v6 V) F- k% y6 [
                                                }3 Q+ U% U$ N" {7 K* m
                                                buffer[0] = 0;  [: o  C4 x3 B5 K5 Y" P, x. N
                                                NRF24L01_TxPacket(buffer,1);, {) F8 i# N( _- L$ V0 i
                                        }
9 }; W( N  ^( _2 c* `! g# ]                              ) Y& i, ?2 m7 f; U& x/ |' }; T
                                }
# z9 b/ J  t6 y- `1 I% `  }& Y                        }9 p4 ^: Z% J2 ]/ O: M9 f1 i
                }
4 W1 O5 z; e. B: }5 E8 i+ H```
2 m( W' j  l* F! M6 v9 K( f7 s
( I, C9 h' B! q9 e) b实物使用截图如下:
9 K! I1 o) J1 }  }* T. O3 h2 C& D, i* n9 l6 G% K* X) P2 a
![12-6.png](data/attachment/forum/202412/19/185713mjuwqnqnzbnnqznz.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "12-6.png")6 P, ^- p$ W& M  C# I: @2 ]# e0 {
3 @1 {* @6 k7 ]! F; [
在实际使用中发现,硬件功耗大概在130ma左右,在数据交互的时候功耗会增加至170ma左右,不过并不影响模块的使用。
0 G( V" H# k8 z& Q5 H' f  Y4 o
- E# j( ~2 L) ?/ A* x2 I* i$ y使用该模块的最大好处就是可以让硬件工程师的桌面更加的整洁。* k: j! H) y1 Y. f
) G( x1 W2 l2 @8 `2 J
硬件设计的时候,设计注意事项:
2 G3 ^) ]5 f& B$ {/ [# q
; F) x( k: y7 ?' I使用PS7516用作升压芯片,将电池电压3.7V升压至5V,为外设可以提供5v的电压输出。
4 j2 G) B) i+ F  e" x( G: p- W5 l1 u; L. S* f' m* r
MP2155为降压型LDO,具有可关断功能,当不使用时候,可以使整个系统处于低功耗状态,从而延长电池寿命。+ h8 x+ `; M' ~6 h5 S

  }4 ]% y2 A" u3 M! F+ [. p. _PW4054为锂电池充电芯片,可使用type-c为电池充电,充电电流由R26取样电阻设定。0 T4 N8 D. `1 A5 w
- O+ r9 K) T* L. o7 c6 y
同时PL5356A芯片为锂电池电压检测芯片,可以显示当前的电池电量,后期将电池电压分压至单片机的ADC内,从而精准的检测电池电压。6 H% ]/ p7 E' o

8 o' g5 p/ U+ n" `7 A在软件开发时候,有以下的注意事项:
" t* H4 s1 q  p: z; m: G# d) n2 B
抗干扰能力:NRF24L01工作在2.4GHz频段,该频段易受到WiFi、蓝牙等设备的干扰。在布局布线时要尽量减少干扰源的影响,并合理设置通信参数以提高抗干扰能力。& R% @0 o! J) V, O/ s4 l
$ g& j7 o+ I+ N# s( t; R
功耗管理:在不需要通信时及时将NRF24L01置于待机模式或掉电模式以降低功耗。
: m2 t3 m( @( `. @8 m6 L. P+ O! K" i. W+ e9 Z- m; ~+ v$ L' ?
距离与障碍物:无线通信距离受环境因素影响较大,障碍物会严重影响通信质量。在实际应用中要考虑通信距离和障碍物的影响并采取相应的措施。
* q- p2 n2 o# l) F/ k* f
5 k2 l" J6 r  o" D3 gNRF24L01的开发过程需要仔细规划硬件连接、合理配置软件参数、掌握调试技巧并关注实际应用中的注意事项。通过不断的实践和总结可以逐渐提高开发效率和应用效果。
2 N0 y8 O; y7 g+ x7 Y4 ~1 @. x- h% d9 f! \% @* z
原理图见附件:3 b6 ~8 E. U6 X9 y9 I
: R' j3 |  j  y1 j# r) o
![PDF.pdf](data/attachment/forum/?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "PDF.pdf")
" ?6 @+ n* U& @
8 ?  h  f7 `6 _$ l! o3 @3 x
12-1.png
12-4.png
1.jpg
1.jpg
赞 收藏 评论1 发布时间:2024-12-19 19:00

举报

1个回答
〃聪聪哥哥 回答时间:2024-12-25 16:51:39

8 U. J" s* ^2 S! |! g重新上传一下 原理图!!!
. a8 w, T8 y$ X+ H' E  C 无线下载器原理图.pdf (1.56 MB, 下载次数: 2)

所属标签

相似技术帖

官网相关资源

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