基于Nucleo-F031的激光测距仪
# Y% H3 @& m+ B1 E6 @) a Nucleo-F031麻雀虽小,五脏俱全。用它来驱动ST的VL53L1X激光测距传感器,是一个经济实用的方案。% y% r$ T7 @& }! M" c1 l2 j- X
* s/ i4 Q, F3 @. q) i
% ~+ a- @. l* F7 d4 w6 f
5 ~% c( F: z) M8 [6 H1 g% z 本方案采用RS232串口通讯方式来驱动VL53L1X。有关VL53L1X的详细资料请参考ST官方:
4 R+ T, w9 v6 _# [9 Jhttps://www.stmcu.com.cn/Article ... ode/news/art_id/707; Z$ B c, @0 N$ J. e
4 G+ ~+ _: \2 ~ H* p
硬件连接:
2 J9 Y/ [& ~3 Q3 T% ~7 _8 T) S5 Q6 k/ U+ E5 n+ N' h3 }
7 P4 L; C4 |# [ Y, e( z6 K. \& Q/ A# Y7 x' G
使用Nucleo-F031的PA0、PA3、PA4来驱动OLED显示屏,PA9、PA10是USART1的TXD、RXD。串口波特率9600,8为数据位,1位停止位,无校验。中断方式接收。
m& l- R. d' t3 Y# X
4 J% A0 M2 L P8 W/ @( [
% |! V0 f2 ?8 M$ V5 gCubeMX的配置:9 v) }' j) M6 `& x
* A' r \; H; z8 E( {
) v3 D7 Z. c7 n# X o; [
; M; u& Y% w5 J运行结果
; M7 Q5 C( @; a: l" P$ B! ~* O4 @' w! q" `& Y; q" z8 o
u# H* @0 V2 o6 l% @. ^2 U% A4 C
6 x2 n1 S5 O1 ?# o$ A* J, ?主要代码:
7 E, d" d2 B V! ]. V! o O- 9 j& j* c2 y+ S9 |: k- e# v- S. _
- int main(void) Y$ L' ]% S4 o: I
- {# P8 O0 L6 W5 J7 n
- HAL_Init();( |* A2 k/ t- T2 p" s
- SystemClock_Config();
# ?' S$ `1 b3 i* h - MX_GPIO_Init();
: p0 q! I! Y( E: K8 x; o& z - MX_USART1_UART_Init();
5 Y5 C# u+ |; n' B; T3 G u [. I# |4 K - LCD_Init();
) g1 }. K' Q' j2 v - __HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);
5 `" d" Y0 C: ~5 N$ R: k8 ^. o - __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
; A! m, ~; l: R1 u; i$ I: B$ U - __HAL_UART_CLEAR_IDLEFLAG(&huart1);
5 _# [5 n. z: @9 d - Tx_buf[0]=0xa5;
X$ P1 D( T, y! Y0 s2 T - Tx_buf[1]=0x45;
+ Z4 f# I2 ?% n- b - Tx_buf[2]=0xea;1 L, U. v2 [! F4 ]" o
- HAL_UART_Transmit(&huart1,(uint8_t *)Tx_buf,3,0xffff);* ], z! Y! f4 J: \$ c! r
- LCD_Print(20,0,"Nucleo-F031",TYPE16X16,TYPE8X16);! b7 ?6 ]' A% I" y7 P
- LCD_Print(30,24,"激光测距",TYPE16X16,TYPE8X16);3 _6 K8 K: K/ O/ B2 F2 `) b. Z: u+ r
- Disp_buf[2]='.';
& j* J/ s9 C4 x( @" R$ M% O - Disp_buf[4]=' ';
! m. H) v$ t) v4 N) O - Disp_buf[5]='C';
9 n6 t8 V3 j6 i8 }0 e8 D6 {3 H8 C - Disp_buf[6]='m';
4 F( z3 b( Z, N( B; f; H - Disp_buf[7]='\0';
v$ P7 ]4 K2 g# {+ c$ U6 l - while (1)) y2 d3 K: c* J) ~- g9 l. ?
- {
& _$ Y0 z+ ]# o3 a - bcdcode=HEX2BCD(Lenght);, H, f. s! g/ [
- Disp_buf[0]=bcdcode%1000/100+0x30;/ r" N* I' E! \) K5 b) w" `& }
- Disp_buf[1]=bcdcode%100/10+0x30;
$ h7 F0 ^9 v" g8 i3 o - Disp_buf[3]=bcdcode%10+0x30;
, X6 N: X0 Q% |: N F" Z - LCD_Print(36,48,Disp_buf,TYPE16X16,TYPE8X16);
P0 ~ c9 H& c" i0 D6 g3 J - HAL_Delay(200);' ~5 W7 s2 [4 v0 P% R# t ?! R
- }
/ @5 T! W: L$ p - }
复制代码
9 c4 O/ l" d5 q中断函数:- void USART1_IRQHandler(void)
8 A1 J: a* t% O6 S - {( n& M2 X! u- s# N
- if((USART1->ISR & USART_ISR_RXNE) != RESET)
% x. \2 Z9 ]( n0 d" Y" G - {
$ E9 R( v. c) L/ q - Rx_buf[RxCount++]=USART1->RDR;5 M6 H; H: ~% ?# O" I: @( w6 R
- }2 ]7 }2 c% }/ m! z' X; t
6 R+ T8 f" c: o$ o, n' s- if(RxCount==8)% Y2 r2 ^* Z$ \+ E7 {
- {
7 f2 w# h( o- O - Lenght=Rx_buf[4]<<8;
6 t$ d C: y+ R |) Y - Lenght |=Rx_buf[5];
; \6 d9 z1 }( z) ^$ i - RxCount=0;
" [( W4 k- G9 |2 H& V( R# ~) A - }
1 R+ u* E' ?' W# i9 A% F - HAL_UART_IRQHandler(&huart1);+ ?5 K+ f) X2 A O! A. U! l
- }
复制代码 8 |. @' e, N6 T2 a1 B2 W
) t W) Y' _' d; r- m8 K, Z
1 @& U* [5 p/ X3 T$ ~# J
6 g# C9 m6 M0 Q& v, S1 S) q- K
7 J% x% D! P: X/ [& u0 W& u6 A! \
|