基于Nucleo-F031的激光测距仪; W8 F/ V8 s, S4 }! k
Nucleo-F031麻雀虽小,五脏俱全。用它来驱动ST的VL53L1X激光测距传感器,是一个经济实用的方案。* l* u# A( V! F7 E, H1 H- O
9 Y! L! ]' {3 J7 Y
" Q# j) I. ?8 S% }
5 A6 T7 \2 U* d; s 本方案采用RS232串口通讯方式来驱动VL53L1X。有关VL53L1X的详细资料请参考ST官方:; E! f& w; r, h& P+ r' k# j" n
https://www.stmcu.com.cn/Article ... ode/news/art_id/707
3 |2 A5 x7 N% n8 G% Z; S \% k6 V6 |9 X% X
硬件连接: v5 N0 J0 o& p5 F
' c. a/ Z& P8 a, f" f8 P% z
- M( V& Q! D& X3 H( j* v6 S
. Q. l0 m1 r3 J使用Nucleo-F031的PA0、PA3、PA4来驱动OLED显示屏,PA9、PA10是USART1的TXD、RXD。串口波特率9600,8为数据位,1位停止位,无校验。中断方式接收。* P8 F* E8 h' s+ j% G0 p, N! I
l7 s3 ?" F s
2 w2 ]7 s% G# K w) a X6 n# C" QCubeMX的配置:
, C! i; h' ?$ D" t# }
: j* j$ ~. P. @& {# r6 x) s- e
- }8 L b" M3 |$ Z! H$ @( J! V) }$ j
运行结果5 e& D; Y* O( m5 A
4 X; ]( a0 w0 [' m& ~- Z# M/ D/ D
2 J; S# d2 P; T! X7 C! _% u) K7 [) e/ N
主要代码:) W0 U# ]* w% D: B' x j
- 5 ?, Z+ ?' A- r0 o' B! |7 Y0 a
- int main(void)
) Y" N5 _6 V+ m i% J6 R8 U - {
4 I) L9 i8 Z$ S7 U/ s - HAL_Init();
6 C! J- N# n* ^7 J) P* R/ I" ?. R - SystemClock_Config();
9 g$ Q' {1 A% }7 L) d4 p - MX_GPIO_Init();
" y2 Y. l% k5 f3 R - MX_USART1_UART_Init();
& y6 J F2 I8 P5 Y - LCD_Init();5 S K. T2 s7 ~+ j- g3 D
- __HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);" i: O) t( n$ ]; P7 ^
- __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); ( u7 h% v4 K* C$ L: m
- __HAL_UART_CLEAR_IDLEFLAG(&huart1);4 B2 O% E/ q1 C9 K
- Tx_buf[0]=0xa5;/ n% i( _, n8 M& ~8 {6 d% a
- Tx_buf[1]=0x45;. ~9 A4 m; Z8 y k
- Tx_buf[2]=0xea;
( i Q+ V$ H" ]" I( t6 w - HAL_UART_Transmit(&huart1,(uint8_t *)Tx_buf,3,0xffff);
1 @* Z6 c q; A5 Y* ] - LCD_Print(20,0,"Nucleo-F031",TYPE16X16,TYPE8X16);6 U' l R! T# K! S+ t* q) O5 Z. Z
- LCD_Print(30,24,"激光测距",TYPE16X16,TYPE8X16);
3 `- E# t# ]* N2 H/ C" w - Disp_buf[2]='.';
7 L( I8 h. h* b - Disp_buf[4]=' ';
2 K% L5 y9 u. m5 |+ Q: ?& S - Disp_buf[5]='C';2 z# Y$ ]" |4 G4 e# V% z
- Disp_buf[6]='m';1 H% ?2 x! o( A7 P
- Disp_buf[7]='\0';6 |7 E% c8 x3 d3 x: }3 J
- while (1)+ I! C Y$ n# n5 E% t/ m% a2 |
- {9 H7 g9 T( K$ ?" ^
- bcdcode=HEX2BCD(Lenght);9 v2 R/ a- Z9 d8 `3 R. G9 s
- Disp_buf[0]=bcdcode%1000/100+0x30;
2 t0 p1 u$ u# Q% n - Disp_buf[1]=bcdcode%100/10+0x30;( b! M+ ^2 g, X: I t
- Disp_buf[3]=bcdcode%10+0x30;
, E5 D9 r3 f- a7 k/ P' _. m9 S2 F - LCD_Print(36,48,Disp_buf,TYPE16X16,TYPE8X16);8 \9 x4 o1 u2 J$ g4 G2 f+ q4 I# s2 |& m; v
- HAL_Delay(200);8 x% @5 L7 e# ^* o! C; D+ K: z
- }
9 j, r7 D. s! j - }
复制代码
+ q, d6 e# n" r- ^% U中断函数:- void USART1_IRQHandler(void)
. {! t4 e/ V X2 w# T N- d3 p - {* _, I& p& G! {* X" O/ B: L* z9 k
- if((USART1->ISR & USART_ISR_RXNE) != RESET)
H& z- ?2 g+ j) ] - {* M# K& d% ?! \9 M) o8 o6 Y3 F
- Rx_buf[RxCount++]=USART1->RDR;
5 p1 w2 {4 `. E4 P2 n+ E - }6 ?2 G" S9 E# ~3 D7 S7 a
- , ?. N9 a% u. _6 X, y$ @# _, Z' O
- if(RxCount==8)/ [" o* ^* i N
- {
6 K" J: _) `" G$ n - Lenght=Rx_buf[4]<<8;
7 V+ \9 v& m! V% \' Q; j- v8 z - Lenght |=Rx_buf[5];% u: K; C9 c; F* l) V- i X: R$ s3 Q
- RxCount=0;
5 b& m6 h/ D. [% }2 v - } 6 l0 w# O# _/ |# ?8 _6 C8 v ?
- HAL_UART_IRQHandler(&huart1);+ o% z4 |$ }# s" U( u
- }
复制代码
* j( H& H( z, [$ i5 T7 X6 D2 b0 ^$ F; X' A3 G8 l5 W
* Z9 P; m8 i. T9 Y8 J6 I2 A9 m* A' d$ H7 t& d
& I0 C& w/ F3 [) C3 {+ X& K
3 o0 H1 M5 O! @; T, D0 t
|