基于Nucleo-F031的激光测距仪, R1 C f9 y+ m3 {
Nucleo-F031麻雀虽小,五脏俱全。用它来驱动ST的VL53L1X激光测距传感器,是一个经济实用的方案。& I$ J5 v: ^7 f! f
2 H: o1 V! S) g) Y8 e
8 w2 O, F: B0 B D* A K' E& y
% b$ _) w) y: f& ?' A 本方案采用RS232串口通讯方式来驱动VL53L1X。有关VL53L1X的详细资料请参考ST官方:
/ [) n4 Q* n0 U7 i( f8 xhttps://www.stmcu.com.cn/Article ... ode/news/art_id/707' U( g% t7 m+ e
) A3 r2 d0 S+ z$ }( a6 K1 H硬件连接:! R9 ^( c+ i2 l$ i
7 W; e0 W) ] {+ Y. u0 M) K+ e
& @+ G( q4 C* \1 ^
/ L9 Q4 W0 u/ d; r9 ?
使用Nucleo-F031的PA0、PA3、PA4来驱动OLED显示屏,PA9、PA10是USART1的TXD、RXD。串口波特率9600,8为数据位,1位停止位,无校验。中断方式接收。" s$ Z6 G# H r3 p9 g5 c
. j. h" b3 j4 y8 D4 H* L) E0 d5 o& X$ w2 H( g/ R4 }
CubeMX的配置:
. D/ @3 A* n; t9 w4 O
: F! k+ P# k5 f
2 e' k! g5 a- t7 B! Y- ^
" z( o" n5 D5 [$ H }5 L. ^, ` p运行结果* n, C* r+ y. W/ D6 U4 [. J
/ C/ m/ b4 d, ~6 e9 n
) S% @$ q o: Z3 l# a Z1 P
: V% N' \* {5 p3 G* a7 d
主要代码:- W. N7 W# w; w6 o- f/ j4 D1 _
- s; h: ~' m+ M0 x% ]! D
- int main(void)+ N7 J- O- R# x7 L8 {' e
- {
- [7 ]# U& @5 v. A4 f - HAL_Init();% m- b# B: O5 @! v" C
- SystemClock_Config();: i" d4 z; p4 e; J" q) u. K9 T {
- MX_GPIO_Init();# [( D2 w4 t! A5 w! i- `
- MX_USART1_UART_Init();: X3 H( g1 a- @) Y7 ]0 U
- LCD_Init();
8 V. n8 N* I5 h - __HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);
; S o. {" X) Z7 T- j - __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); ; c. Y9 C" L5 F0 P% r
- __HAL_UART_CLEAR_IDLEFLAG(&huart1);
$ X1 I( M1 T. W# O* F- Q/ V8 t$ ~ - Tx_buf[0]=0xa5;
, t; {; u, G5 V8 A) {2 f9 I - Tx_buf[1]=0x45;* E% V) W* }+ E( y/ r7 {( U3 G2 M
- Tx_buf[2]=0xea;& w$ j8 e# _4 L: U0 T5 D
- HAL_UART_Transmit(&huart1,(uint8_t *)Tx_buf,3,0xffff);0 o! G% v! ?* n0 j
- LCD_Print(20,0,"Nucleo-F031",TYPE16X16,TYPE8X16);3 {' |9 U4 M, }3 X, R
- LCD_Print(30,24,"激光测距",TYPE16X16,TYPE8X16);
2 X+ b- R/ O$ R4 N) n! ]( s - Disp_buf[2]='.';4 q4 D; H6 m4 Y) W+ P! H
- Disp_buf[4]=' ';6 l' Y& j' d; K& F q5 {
- Disp_buf[5]='C';
% V- V# P$ I& {) I: C" y5 q - Disp_buf[6]='m';
8 \+ Q% I& V) S( _4 s! H; P - Disp_buf[7]='\0';
" `+ w: |" _0 a$ ?* @$ X- ` - while (1)
$ T* D. ?8 y1 W: ? - {
& _! J4 B. ^& n) i7 m3 W+ j l - bcdcode=HEX2BCD(Lenght);3 I2 M4 U7 G9 J) @7 O
- Disp_buf[0]=bcdcode%1000/100+0x30;! k' _+ v# E. t: ]7 l" g* f
- Disp_buf[1]=bcdcode%100/10+0x30;
, |) [" z+ }' v4 z( g - Disp_buf[3]=bcdcode%10+0x30;8 h! ?, ~" H9 ]/ K+ b$ [
- LCD_Print(36,48,Disp_buf,TYPE16X16,TYPE8X16);( h2 M1 @; [8 T1 o S+ Y
- HAL_Delay(200);% L6 o; F* g1 }. \" J% P
- }
/ K S3 c, p" A, { - }
复制代码 % E# q9 ?7 W& ~ }7 R8 O
中断函数:- void USART1_IRQHandler(void)
5 r6 G' `4 u5 @6 T* U8 Z - {/ k: D0 _4 o. X# G
- if((USART1->ISR & USART_ISR_RXNE) != RESET) # a9 D$ {" }% [9 E7 [6 z" W
- {
" P7 ^1 t0 j. X+ V' W7 v# B+ ]. Z - Rx_buf[RxCount++]=USART1->RDR;
$ r0 u) U* X# M4 _8 X - }9 d' {9 Y! X6 g% q' w* }
- ; N2 {( v: S6 {$ t5 d
- if(RxCount==8)+ J: p9 o; }# g6 H& A0 e
- {# H8 D+ u' } W# Y9 T" O6 G
- Lenght=Rx_buf[4]<<8;
7 r7 O$ m* ]9 V - Lenght |=Rx_buf[5];
5 ]! H! h v- A6 E: r) _9 j3 C! [. N) u - RxCount=0;
5 t! ~5 W1 { s* I0 p# b; [' q6 i - }
3 B- J7 @3 n F) ~: t - HAL_UART_IRQHandler(&huart1);2 y1 F6 C1 m' X0 c% q! I7 y
- }
复制代码 4 B. j: K8 j% s, ~2 x. K! s
4 t9 r& s2 ~9 |8 L* |7 B
7 l: \* s% B3 r1 z2 Y) _& H, J, @9 }9 j. p! P8 F
i" M$ P4 j1 [4 @4 d. p" x2 u( n6 v; ?* L8 @2 K0 Q8 ^
|