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

使用STM32F103制作的无线下载器

[复制链接]
〃聪聪哥哥 发布时间:2024-12-19 19:00
项目设计的前言:作为一个嵌入式的工程师,在编写代码时候,难免会遇到不同电平之间的转换。例如:RS485通讯方式,RS232,TTL信号,为了查看通讯之间数据的正确性,经常使用到不同的电平转换模块,还需要一个USB转串口工具,将数据上传到PC端,这样我们才能将查看控制器或者是负载返回的数据,为了避免调试代码起来方便,让自己的工作变得整洁,方便我们自己的工作,前端时间正好研究SPI通讯方式的NRF24L01这款无线芯片,利用业余时间做了一个无线通讯模块。在这里分享一下开发的经验。' C6 t# h, n  O3 U; k: O
5 ]+ y* o+ Z/ q' U8 r: {
一:部分原理图设计:0 v2 N3 o" R' n( U" k

" P2 s. w: M% @6 a6 z![12-1.png](data/attachment/forum/202412/19/183819haf0jpwfrbfjj9er.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "12-1.png")8 ^2 a2 ?" J: r0 R8 b

; g* A& e5 h6 s; I二:PCB图展示:# O1 T9 A1 c$ g) ^/ K* T6 I" }
" L" n, w! Z' l1 m1 ^$ s
![12-2.png](data/attachment/forum/202412/19/183852j26ztttwzci2cc1t.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "12-2.png")
$ F- k( m5 l/ r5 h4 B- ]% k3 ?& a2 t' b6 a/ O
三:软硬件设计的思路:6 y0 E: W  q4 `$ G( u

, T" R4 m7 I( @' Q0 d  ~在本次项目中使用主控为STM32F103C8T6芯片,当时使用该块芯片是因为该款芯片具有USB功能,该芯片可以虚拟一个USB的串口进行数据交互,而且封装也比较小,在PCB布局方面比较简单。
/ J0 U! L& \5 p+ G- I
: H- X0 L# C2 I0 P无线模块采用的是一款SPI通讯的NRF24L01芯片,在实际的使用过程中比较稳定,可以满足数据之间的交互。
3 E2 [3 w( x  J, P/ W/ {
6 l- z( S' y% b, R软件设计思路:利用串口1的引脚的接收发送引脚,使用消息队列的方式,可以将USB下发的的数据发送出去。+ `: {6 k+ E6 V" S

& d: F6 O$ `9 w% s1 A使用串口2完成与SPI之间的交互,+ F" X6 t, N3 L  I: X6 X
; E$ B( k- \* g( ]2 K6 B7 U
软件配置参数:使用STM32cube MX软件生成USB,SPI,串口底层的驱动部分,这样开发起来也比较容易;) b1 o) X2 d8 e8 g! Z- S
( k; A4 o# z/ O" f
cube软件配置图如下,主要是对该项目中使用到的引脚进行配置( T8 x- ?, f2 n

. R1 T( K$ O% W" u8 @( i  k![12-4.png](data/attachment/forum/202412/19/184938vzhuojy923nhu3lj.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "12-4.png")
* y  S" x& d  a$ Z+ U! l& B& p
2 j  e7 i6 ]5 K" y0 l部分软件代码:/ _9 T* y/ A2 A  R

9 d9 W1 ?* {& K) Y5 l```abc
5 d7 g6 ?" Q( N; Q. ]                if(sd == 0)+ S* `7 b5 ]* e4 R* ]* N
                {$ b; J/ Y+ b% j
                        USART_Cmd(USART2, ENABLE);                    //使能串口
! d$ v! H0 y: N: s/ V, b! z5 Y                        if(        linecoding_old.bitrate != linecoding.bitrate ||9 i& b) \3 A. w5 n* r
                                        linecoding_old.datatype != linecoding.datatype ||
" g$ R/ e0 u; Q* p9 b$ l# c  v                                        linecoding_old.format != linecoding.format ||" m1 @( V1 D; a( q6 g0 n& t
                                        linecoding_old.paritytype != linecoding.paritytype )3 V2 X" W/ A2 Q6 e+ G4 N! X
                        {
  n: F9 r' `; Q5 `2 F9 p. j( }5 F+ H0 V                                if(        usart2_flag == 0 )
  s: ?$ H" l: T. O% U$ k  A) ?$ V' m4 N                                {
0 c5 R+ j& g# _- O( H4 z, Y& l  B                                        uart2_config_change(linecoding);
9 i0 H" U) k1 ~3 C( \& ^/ j# Z0 V                                        memcpy((void *)(&linecoding_old),(void *)&linecoding,sizeof(linecoding));
" N. k8 k1 ]# J, L1 ~, ?( ?                                }
. u3 V" O, F8 R) X; Y                        }  y3 K. m0 e! U3 j" _; B& V+ K$ d
                        else if(queue_size(&Qusart2Send) > 0 && usart2_flag == 0)
) X) \; j5 P6 r+ w                        {
; }( Y+ M; [$ [( u8 e& b                                QueueElementByte data_byte;1 O6 }3 x4 w% M. G, Z% _, o
                                usart2_flag = 1;
. x0 O# L% X8 ?3 h- p7 F; |; T                                if(dequene(&Qusart2Send,&data_byte) == 0 )
) i0 w& Y2 Z& n1 L. b! o7 D                                {8 x4 i" \, @% U1 ~/ X, }2 g
                                        USART_SendData(USART2,data_byte.buffer);
5 t1 Y3 S8 G5 X                                }
' \: C4 k5 i! l  b# f4 ?7 g* r                                USART_ITConfig(USART2, USART_IT_TXE, ENABLE);//开启ENABLE/关闭DISABLE中断
5 [+ C# K6 C8 T, G, S4 M8 \                        }' r: ]$ C8 t+ H$ v, B6 m! {( @, Q" v
              # W9 {' j2 S# ?1 z: B
                        if(GetEPRxStatus(ENDP6) == EP_RX_NAK)
; z- \, a8 O4 |9 D! N9 y+ `2 P" V6 v                        {+ p# p% Y' t: M9 r2 E
                                SetEPRxValid(ENDP6);* k! M" Z0 v1 S* s
                        }
+ ~/ [8 |# j# I( N1 i* n( S: ?                        if(GetEPRxStatus(ENDP4) == EP_RX_NAK)
. ~- f3 U& x1 q7 M$ _1 l                        {
3 `. b3 M' d5 x: j. L                                if(CDC_MAXSIZE - queue_size(&Qusart2Send) >= 64 )
3 ?; W4 h, N. V( D1 [8 Q                                        SetEPRxValid(ENDP4);( {/ ^1 u& j# V
                        }6 k+ K$ f$ `. H% a
8 m/ J" u) o) h7 G  \
                        if(nrf_state == 0)
( P6 D6 m  `# b: S, Y6 C; X7 M$ n                                NRF24L01_TxPacket(buffer,1);: d& b4 [# f5 A; w
                }
8 k: ^, g. n9 J9 F+ p* T                else
4 ^* h* E/ @# N: {% v9 _# R8 U                {
' c6 \$ N' E& Z! @$ |                        USART_Cmd(USART2, DISABLE);                    //失能串口 ( h. Y) ~+ ^7 G  F
                        if(nrf_state == 0). J3 p. J2 U' t% A" t" @% h
                        {
/ N6 ~& Q" I- B$ q                                if(dap2nrf_Data() == -1), t/ _" P& _) ~, b! F  D8 O% c6 E
                                {1 h+ L% F# M4 e: B
                              5 F3 A8 m- |+ L" z% |, E
                                        if(GetEPRxStatus(ENDP6) == EP_RX_NAK)
* I' O- |9 m" c& V7 |! s                                        {3 w2 [: K2 p% P
                                                SetEPRxValid(ENDP6);* u3 V$ V; L( U3 P( z* W  ?
                                        }9 b5 U( ^3 q& P2 z/ l. i  ]/ t' s' ~
                              
  H$ t& ]) C( s7 h. [                                        if(        linecoding_old.bitrate != linecoding.bitrate ||$ R2 o6 ]0 E  ~; j
                                        linecoding_old.datatype != linecoding.datatype ||" k: c% k6 _3 l: ]1 b# P
                                        linecoding_old.format != linecoding.format ||
2 ?$ h1 e* _! m                                        linecoding_old.paritytype != linecoding.paritytype        )2 V% }# o1 |9 b, J6 Y( h
                                        {+ o7 S$ M  Q) @8 m( t) g) G: @
                                                buffer[0] = 33;//特殊串口设置指令
( ?8 O: |) T' _8 n: H+ O                                                memcpy((void *)(buffer+1),(void *)&linecoding,sizeof(linecoding));
% ]& ^; [" ~+ a  H" F                                                NRF24L01_TxPacket(buffer,sizeof(linecoding)+1);
9 J. I1 E! i; E1 M8 ]+ V                                        }
8 V; s; W3 U1 d$ _4 H: O                                        else if(queue_size(&Qusart2Send) > 0)
; l$ H, h! ]# P/ C1 j5 ], {                                        {; ^$ p/ z( `9 ~/ Y& h- L8 u" P0 g
                                                QueueElementByte data_byte;4 V" p$ D0 }* n! s0 Q( g0 Z+ w1 y
                                                for(i = 1; i < 32; i ++)- @) P4 s/ j7 S6 w$ E/ u
                                                {
0 U% e6 |7 t! Z                                                        if(dequene(&Qusart2Send,&data_byte) == -1 )4 h1 a) z5 y. k+ l8 b; ^# T1 k
                                                                break;; v+ w' w! j* y+ D5 f& a
                                                        buffer = data_byte.buffer;
4 y( t5 C( _' e8 g/ \- I0 o) a. H                                                }7 Q& d0 g' t! I
                                                buffer[0] = i - 1;; s" Z3 B: e2 _. T
                                                NRF24L01_TxPacket(buffer,buffer[0]+1);
  p6 P& v8 i& p4 g9 h                                        }
. T6 S% s& B: B% h0 ?: N                                        else
/ `2 ?4 L! l) e  n                                        {& ?( i$ m+ i5 y* Y- {; v
                                                if(GetEPRxStatus(ENDP4) == EP_RX_NAK)9 J) b4 M* }  r- O; P+ S
                                                {
" a' R) u3 k% ^: l" l                                                        SetEPRxValid(ENDP4);' M  B5 t; ]0 G" t9 r: w
                                                }, W2 D$ v2 e' H) V! v9 V% L
                                                buffer[0] = 0;2 F/ f$ ?% b( Y, S
                                                NRF24L01_TxPacket(buffer,1);
- e- j. ^! Y( p                                        }8 g/ ~5 n0 D1 F' j
                              
, z: ]  y1 _/ o. ^- C                                }; n. J$ @$ b5 k
                        }
( N& S% \! p! i1 J) m                }
+ \! e/ Q$ ~! ]/ B```
6 y3 _$ {  a9 z( v" W- c5 u. k6 x( s* t, ^. M" Y
实物使用截图如下:9 m0 T3 Y% j  X) s+ C9 Z" T) `

4 S9 @2 S1 G# e' ?" D* M0 `% P6 W![12-6.png](data/attachment/forum/202412/19/185713mjuwqnqnzbnnqznz.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "12-6.png")
3 |; ]* f1 Y$ W1 L+ Q5 ?
7 t& _/ y. n' X" y在实际使用中发现,硬件功耗大概在130ma左右,在数据交互的时候功耗会增加至170ma左右,不过并不影响模块的使用。7 x! I. A# x! T+ e
& |$ _! j- W3 a
使用该模块的最大好处就是可以让硬件工程师的桌面更加的整洁。8 C5 b5 j& t: Z1 m' ?. {) `' t

2 @1 \  V* X% h1 i1 M' F6 S硬件设计的时候,设计注意事项:% J6 g, o# D1 W3 |* ]6 Q6 s! i

% u4 y5 f( @5 N1 s- I" W使用PS7516用作升压芯片,将电池电压3.7V升压至5V,为外设可以提供5v的电压输出。
+ n+ @: S& f/ C$ U9 d* M$ s
# |9 G3 c( F5 U! T. Y' \2 j, RMP2155为降压型LDO,具有可关断功能,当不使用时候,可以使整个系统处于低功耗状态,从而延长电池寿命。
5 O( P; H: n* z' q4 u5 u. M! R$ a) u6 s4 q. H; ^0 e1 T! P$ h
PW4054为锂电池充电芯片,可使用type-c为电池充电,充电电流由R26取样电阻设定。
+ S' x2 {' ^. o5 _7 H9 K, {7 d
0 v/ T' F  }, D9 ^) }( _同时PL5356A芯片为锂电池电压检测芯片,可以显示当前的电池电量,后期将电池电压分压至单片机的ADC内,从而精准的检测电池电压。% x$ T2 H/ {9 H( j$ W) a1 g

( g. A- S4 V4 A在软件开发时候,有以下的注意事项:
! p% d7 y% u% U  \4 b- d8 H, v( W$ g) E& W3 N. I9 W6 B8 m
抗干扰能力:NRF24L01工作在2.4GHz频段,该频段易受到WiFi、蓝牙等设备的干扰。在布局布线时要尽量减少干扰源的影响,并合理设置通信参数以提高抗干扰能力。
( `! y; U: v) D- `: b. ?* n% L. W
( k: C6 N! y' p9 k7 e功耗管理:在不需要通信时及时将NRF24L01置于待机模式或掉电模式以降低功耗。
) b' @# A0 O8 m. u( U
# F1 F: \: U7 T- ]7 [距离与障碍物:无线通信距离受环境因素影响较大,障碍物会严重影响通信质量。在实际应用中要考虑通信距离和障碍物的影响并采取相应的措施。
( @. Y9 c8 g7 v6 u% c/ n
, h9 Z( g, U. Q- A; n5 x' K0 ANRF24L01的开发过程需要仔细规划硬件连接、合理配置软件参数、掌握调试技巧并关注实际应用中的注意事项。通过不断的实践和总结可以逐渐提高开发效率和应用效果。
9 D( v- N+ l8 S# V3 Z7 H
6 |9 E! B& e3 U原理图见附件:
2 s- y+ x6 _" I' ?5 m
* o& h4 h8 w) z2 ^# v8 ^6 Y![PDF.pdf](data/attachment/forum/?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "PDF.pdf")
" s: o, e1 u- w3 F* ]" T
$ @( F1 b! I8 y( ]
12-1.png
12-4.png
1.jpg
1.jpg
收藏 评论1 发布时间:2024-12-19 19:00

举报

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

7 e1 K# l9 ]* h0 u8 \重新上传一下 原理图!!!- `/ s, g& d4 q' N2 F+ b
无线下载器原理图.pdf (1.56 MB, 下载次数: 2)

所属标签

相似技术帖

官网相关资源

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