基于Nucleo-F031的激光测距仪# f/ I, d4 ?, x
Nucleo-F031麻雀虽小,五脏俱全。用它来驱动ST的VL53L1X激光测距传感器,是一个经济实用的方案。
& b: `. H' `6 e2 y) h R- T5 y& b3 X
3 ^# ~' N; t3 g) u( b- x8 \ x
6 C* y% P3 \0 v+ E- [6 U
本方案采用RS232串口通讯方式来驱动VL53L1X。有关VL53L1X的详细资料请参考ST官方:
; D1 {" O# Y4 W4 Z0 Thttps://www.stmcu.com.cn/Article ... ode/news/art_id/707
4 |$ M; B9 I( L" J! X$ p7 k c+ o$ h3 I5 c! f# r1 Y
硬件连接:
1 S" W* a* l6 n1 w6 o. [# f7 E! H
/ B5 t- k; T4 b/ o6 m
3 r G7 s l9 f2 c使用Nucleo-F031的PA0、PA3、PA4来驱动OLED显示屏,PA9、PA10是USART1的TXD、RXD。串口波特率9600,8为数据位,1位停止位,无校验。中断方式接收。
4 o$ H( e; g4 x+ B! x) P- ^2 n4 ?8 \9 Y
) j$ U+ }7 X/ [: N
CubeMX的配置:
0 M, k9 I. U4 t5 h! P
& ?$ O( j( F; Y# h1 n
% ]( R5 |6 R$ E3 w7 G
1 Z1 i7 c& F' {运行结果- F% I" f6 N0 o9 J8 ?; N1 Q. m2 A
% k7 z1 [, a; R( `. A
, C! q0 z' e3 [" ~% G+ \. F* V7 i0 }& O; F' ^' L! C: g- b
主要代码:9 y: ~0 i; E" O, h
- e0 |; @: }" y3 h. w- int main(void) v; u2 P( O; p9 M
- {5 v; ?1 t4 G3 F& I# V! j/ v
- HAL_Init(); ], m) i& n* A
- SystemClock_Config();$ u3 P9 }4 ~1 {+ C: C3 O B. z
- MX_GPIO_Init();
5 @3 i) y$ {, P6 z - MX_USART1_UART_Init();
. m( Z$ \7 Z8 N' T1 _1 p - LCD_Init();% s- b8 \1 K2 n; V
- __HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);
/ K& \) t# K1 _- E - __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
+ R' N- i) ~- H8 M/ }' b - __HAL_UART_CLEAR_IDLEFLAG(&huart1);
6 `* S f- O' w/ R H - Tx_buf[0]=0xa5;
' g: T, i/ |- Q - Tx_buf[1]=0x45;4 x3 O. G1 e( i7 P4 q3 b' S- I2 [
- Tx_buf[2]=0xea; I2 S g) Q6 ]+ ], W( l. `
- HAL_UART_Transmit(&huart1,(uint8_t *)Tx_buf,3,0xffff);* v# G, T' ?: p6 f
- LCD_Print(20,0,"Nucleo-F031",TYPE16X16,TYPE8X16);
, Q3 W2 D7 z5 J - LCD_Print(30,24,"激光测距",TYPE16X16,TYPE8X16);* g3 [7 F- j. x) b, S6 y) ^
- Disp_buf[2]='.';. v" [7 m4 [/ r; p+ ^% p
- Disp_buf[4]=' ';
2 a# a* d* y+ S$ ?" T) @ - Disp_buf[5]='C';: g/ C. [9 a3 Q- j% j
- Disp_buf[6]='m';
. A) C0 O$ l* G/ K( o4 _- `2 j - Disp_buf[7]='\0';
9 b6 @$ `5 n6 }2 [' B* Q - while (1)2 x4 O/ ~, Q3 N+ a0 }" a
- {
; R) i. c2 C% S - bcdcode=HEX2BCD(Lenght);
. o3 _* |: F3 N6 x( E9 |4 z6 F* ~, O - Disp_buf[0]=bcdcode%1000/100+0x30;
$ Q4 K% N* B, e9 F1 W$ W) ~ - Disp_buf[1]=bcdcode%100/10+0x30;7 W) @$ P% M) m) g
- Disp_buf[3]=bcdcode%10+0x30;- P! D. k3 b j" I
- LCD_Print(36,48,Disp_buf,TYPE16X16,TYPE8X16);
4 N7 J( o9 ^. [5 Z8 j4 e T - HAL_Delay(200);
! }5 R L8 p8 L9 R( o - }
4 b4 |, @$ n$ g( Q - }
复制代码
) n! ? [" I: o& J* b中断函数:- void USART1_IRQHandler(void)
& e3 ?: X8 F( w' a" s - {
9 V( b- M+ p4 s( Y7 c2 i3 a - if((USART1->ISR & USART_ISR_RXNE) != RESET) / I6 Z. e4 j' d9 j
- {- @- @9 u# n" U$ y) B2 V- q# J+ h
- Rx_buf[RxCount++]=USART1->RDR;! R. k2 e: a" e- O: c' }( e
- }
+ W7 r: K8 Q, ?7 ?- |
3 B. `& T3 {- N3 b1 {- if(RxCount==8)
" I8 e; n. b3 f% m, r/ `8 g - {. [( v' W6 R& w2 S
- Lenght=Rx_buf[4]<<8;' K/ Z+ Q# b. o% y6 f1 k
- Lenght |=Rx_buf[5];$ i% h! Z0 ]; L
- RxCount=0; 3 H _0 o4 R& c8 g. y0 z5 ]$ W" P$ V
- } $ X3 B( Q4 I$ _& S# j" Z1 m7 M
- HAL_UART_IRQHandler(&huart1);
8 ^1 {( }, F& L - }
复制代码
$ z: ?; U6 W7 g( X' Z b2 N6 U) k9 i2 p3 L5 V
/ m V3 p1 Z- v, K: O: Y9 y9 z6 Y0 s5 s. ]( D2 N* |
' q* p' L4 L0 q. t( m1 M
$ R! y2 Y! z8 u( E
|