基于Nucleo-F031的激光测距仪
# A8 u8 C. g! p7 Z {8 } Nucleo-F031麻雀虽小,五脏俱全。用它来驱动ST的VL53L1X激光测距传感器,是一个经济实用的方案。% S, R* Z- k- _& o/ s# Q; X/ S
' g* R4 h f- x0 a# c' N
& C9 ?( j9 X2 }6 D6 ^
3 h# _$ D, w/ c 本方案采用RS232串口通讯方式来驱动VL53L1X。有关VL53L1X的详细资料请参考ST官方:
& ]8 o5 B, n* T/ l* |7 V: bhttps://www.stmcu.com.cn/Article ... ode/news/art_id/707
' B$ m& G- O" z; Q0 ^. @! h: R% l
# `$ i$ H# }! {- P& c, ]硬件连接:
* h8 \+ E5 K8 H% Y/ [& j" H) A ^5 G/ I3 a2 V
5 G$ B7 Y2 J: c9 i/ N- s* e* t
4 I; h+ ^- l% L: W- D' |使用Nucleo-F031的PA0、PA3、PA4来驱动OLED显示屏,PA9、PA10是USART1的TXD、RXD。串口波特率9600,8为数据位,1位停止位,无校验。中断方式接收。
! M b( L6 `! l! R1 h
7 {- `) F8 e; V4 ~+ Z; l/ q9 m- X7 q6 p4 s' Z5 |0 O" e! Y
CubeMX的配置:
+ x5 q p2 e8 ^ M+ K% S4 P. F( V+ I
5 d" G" \/ Z' j G5 Z5 R* o
2 H6 r5 z( y+ N' `- J( i2 p
6 l, @9 F0 H" u( j运行结果- U+ T; b8 r' l2 J4 u4 m i
5 a$ ^* q( s8 r. ]
) ~5 o# `& J9 j3 B+ e
: W8 J! L- h* G7 l* S
主要代码:
$ i. ]& X# @2 P; D* Y& x/ }
1 S; M: m3 u6 k+ ?- int main(void)
( S1 e' m! R9 Z$ K - {
5 L. \% o7 E& R; @$ s1 n - HAL_Init();
: U: e" Q. _/ c- D+ M3 } - SystemClock_Config();
5 c# c3 m8 A8 h3 E: a7 z - MX_GPIO_Init();
' z' j6 ^5 ?. V1 T - MX_USART1_UART_Init();
: Q G) a0 S9 Y1 ^% m - LCD_Init();
" A$ O9 X3 ?3 \ i( n - __HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);
( r0 p( V5 _5 C2 g! X - __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
" F3 r6 a( \) Q6 Z+ q! g f - __HAL_UART_CLEAR_IDLEFLAG(&huart1);
' j8 B) b2 z% G, o. ^ - Tx_buf[0]=0xa5;
' R0 A: Q9 C% w- Y0 M4 D# V; c - Tx_buf[1]=0x45;0 O& |. B7 ?& K
- Tx_buf[2]=0xea;! q( T3 G1 T" k; j
- HAL_UART_Transmit(&huart1,(uint8_t *)Tx_buf,3,0xffff);. q4 o2 J0 B% C7 t7 B+ O
- LCD_Print(20,0,"Nucleo-F031",TYPE16X16,TYPE8X16);0 k% H' \ K4 f. z$ }
- LCD_Print(30,24,"激光测距",TYPE16X16,TYPE8X16);
7 K0 W9 B# ]+ j* s7 o+ { - Disp_buf[2]='.';
7 v, q' z1 V X& _( b - Disp_buf[4]=' ';
, p+ i- ?6 ^6 `' ^4 r, z; q5 O - Disp_buf[5]='C';/ A) E. ~9 B+ U' H- [/ f
- Disp_buf[6]='m';8 j3 M/ t5 Z, Y$ m8 W1 R# T7 m
- Disp_buf[7]='\0';
. h3 D2 t# B& z6 z" X - while (1)
! L3 X# p. l( x - {3 K' e4 |$ l8 b
- bcdcode=HEX2BCD(Lenght);5 S q, ]3 P$ d, k5 @( V7 |( |9 r
- Disp_buf[0]=bcdcode%1000/100+0x30;
% u p& n/ ]6 }" S8 v* V - Disp_buf[1]=bcdcode%100/10+0x30;
3 e* n( C' R* x I6 e - Disp_buf[3]=bcdcode%10+0x30;
' z3 C2 d/ \/ C# V5 E! @% M - LCD_Print(36,48,Disp_buf,TYPE16X16,TYPE8X16);9 S/ M( o' X( i) m
- HAL_Delay(200);
% m' M8 X4 a: B6 n+ P2 Q1 O( u - }
8 K( w L1 F/ `+ j0 } R - }
复制代码 3 k: P& E& r5 S! i F
中断函数:- void USART1_IRQHandler(void)- z/ _" L4 H3 S5 B
- {
" D9 w1 j- }, j, C - if((USART1->ISR & USART_ISR_RXNE) != RESET) ' G" q# w" V# A/ B
- {/ k$ v7 a' S3 Y3 M+ I3 R$ u1 O. t
- Rx_buf[RxCount++]=USART1->RDR;
4 B7 j% s+ B, g; B; a T - }, I1 \- M$ I5 A+ _+ b6 A8 T
2 l* R5 s' S% k' |2 y ?- if(RxCount==8)% z7 C! ^; D) _' M
- {
( V# I5 K. G9 r - Lenght=Rx_buf[4]<<8;
! s7 k( f: V0 W( Y7 B9 K - Lenght |=Rx_buf[5];
0 i& @$ d0 j; r1 i3 b7 t" ^ - RxCount=0; - t+ ?' A8 K# r3 i: p& c
- } 3 ~# Y2 j* l+ V! J( i7 d
- HAL_UART_IRQHandler(&huart1);
$ {. n* k$ [9 f: |% {- H( E - }
复制代码 1 e+ B' l) K5 ^+ J. s
3 J/ J+ q4 ^( K+ }) R% R# _; s
7 M1 s( o* ]& ~7 Q; A
; T3 n6 g" e1 g9 r* L4 k6 V
; g# H2 t/ N* \# D" v" u0 p5 y: f
; e+ y6 j- T) a" h. P3 A |