基于Nucleo-F031的激光测距仪
: Q3 ?. }1 Y7 w3 z6 |: l* u+ E Nucleo-F031麻雀虽小,五脏俱全。用它来驱动ST的VL53L1X激光测距传感器,是一个经济实用的方案。
8 b. W% u6 i8 @4 ^, P0 m, V: @8 N% r
+ G0 r1 N6 j0 q- K4 X+ z4 N3 ^4 u2 [ g* M* d# N, Y
本方案采用RS232串口通讯方式来驱动VL53L1X。有关VL53L1X的详细资料请参考ST官方:
. w; s9 t- v4 y( @https://www.stmcu.com.cn/Article ... ode/news/art_id/707
, q9 k" f1 L) Q' N" [' g
0 S# K1 y$ N# i( Q! \1 p$ [硬件连接:& ~" A. i- g2 N, i9 G" R
4 u! ?9 @( o& m& Y2 d9 Q& N
: z8 q! e" ^) [0 N; z4 j
& g. ]' y, X" e. e7 P9 ~
使用Nucleo-F031的PA0、PA3、PA4来驱动OLED显示屏,PA9、PA10是USART1的TXD、RXD。串口波特率9600,8为数据位,1位停止位,无校验。中断方式接收。5 k" J* [( f5 v2 |4 f; u8 G
- s) D5 V) X8 E5 B0 |7 E/ F
; g$ F2 F( }5 T# nCubeMX的配置:
/ ?1 W* Y% z* h: g( `
9 _" i W$ i1 e% ]3 J
0 U, }" ]/ G7 G/ [
# M+ p1 R; b3 \, K# q运行结果
$ C: z" F- S- r
- W+ [' F1 `( ~: H* }$ ~ _
4 O: B" {1 t+ v) t3 _* K6 g
4 F: s- ?0 ?* G# C. Y/ K) O% c主要代码:
8 c" q( Q& E: X* ]$ t) Z4 k9 s- ; \& F; ~% d+ d# z( }
- int main(void)
; t( {. y. {, j. N! \: q( j( ` - {
* a8 r0 D; E) P; P4 v7 O- a0 Y - HAL_Init();' x ?6 G! S2 ~: S5 u) C! O
- SystemClock_Config();
% s1 L4 E5 u7 q, j; v1 F - MX_GPIO_Init();
3 L, `6 W4 W; {1 ?! {" l0 l - MX_USART1_UART_Init();7 W0 K* v# p" T& f( T9 i% G
- LCD_Init();- _" z% Q; v( D" t8 K7 J9 }
- __HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);
' D: z1 e( ]! \) X; Y - __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
& _$ h4 q( L6 t+ k" U8 L4 \ - __HAL_UART_CLEAR_IDLEFLAG(&huart1);8 `/ @' Z! z" \- p+ O8 ?
- Tx_buf[0]=0xa5;
4 n, q; W# j6 Q& x- m( k# ? - Tx_buf[1]=0x45;
' ~* j G0 `5 `. f7 e1 e7 U - Tx_buf[2]=0xea;
" f, y# ~7 l7 S' P9 h# p* { - HAL_UART_Transmit(&huart1,(uint8_t *)Tx_buf,3,0xffff);
9 E3 N0 K0 k6 c9 A - LCD_Print(20,0,"Nucleo-F031",TYPE16X16,TYPE8X16);
4 |& S) \) R. o7 R: j- ^9 ~ - LCD_Print(30,24,"激光测距",TYPE16X16,TYPE8X16);- f8 C2 W0 p w; M
- Disp_buf[2]='.';
/ y. y7 |7 J& i/ q; l - Disp_buf[4]=' ';. F* w- a [% V3 u6 S7 M" ^8 [! _
- Disp_buf[5]='C';8 Y! U) b% B, T' \$ y
- Disp_buf[6]='m';* n; v& `+ T! W
- Disp_buf[7]='\0';
* |- G7 t$ k% m" E; b, | - while (1)
2 m$ `7 S9 _* @2 t) W5 P - {
0 H' K4 }! K4 a. v+ c0 C% I2 D - bcdcode=HEX2BCD(Lenght);# t" u- ~+ ? l" Y
- Disp_buf[0]=bcdcode%1000/100+0x30;1 Z% m! i/ }2 I) D
- Disp_buf[1]=bcdcode%100/10+0x30;9 d9 W* ~% l p
- Disp_buf[3]=bcdcode%10+0x30;
% J- }8 G. z u6 t - LCD_Print(36,48,Disp_buf,TYPE16X16,TYPE8X16);+ ^; k( m' n2 e8 V- z
- HAL_Delay(200);
/ q+ a4 o9 d- X" Z6 h" {: e - }+ a0 V; [" Y1 z' ^; l& Z7 F! s
- }
复制代码
+ A: o; O3 c% V% \3 T* z中断函数:- void USART1_IRQHandler(void)
# e0 i% y: Y& ~+ C, t - {6 d. ?; W E3 K K
- if((USART1->ISR & USART_ISR_RXNE) != RESET)
- H- Y# p0 q5 W - {
6 ~4 y6 O3 O9 _" u ~, m0 b! @ - Rx_buf[RxCount++]=USART1->RDR;& Y- m$ ^) M* }$ V7 {% [
- }1 ~; U7 V: x2 }5 \5 q9 y4 j
9 S1 C2 D* ?. B! T- if(RxCount==8)6 D: w+ \- a# S- z
- {
+ s i% R- ^$ Y7 h {2 ^3 I - Lenght=Rx_buf[4]<<8;
9 q& k# S3 c d/ p. v/ l - Lenght |=Rx_buf[5];
: b" A% o# e+ l9 a# Y- c - RxCount=0; 9 c6 K+ U+ \% g* i# c
- } 8 q9 T; u! Z1 d: w# v3 u1 G
- HAL_UART_IRQHandler(&huart1);
0 F- A" j$ n0 p8 }/ N - }
复制代码 - n9 R8 M+ \6 }/ f
7 C. G6 n( B G) v* V5 L
9 p- l1 a2 S" Y b- e2 @1 s D( W
: m- m7 ]* c* n& f" V
" q" r8 ~# X$ Q/ Z0 P( g
0 J( l( k- w8 r9 g1 @8 q0 Z$ n |