基于Nucleo-F031的激光测距仪
, w2 u8 D* \: ~ L/ X h: ]- | Nucleo-F031麻雀虽小,五脏俱全。用它来驱动ST的VL53L1X激光测距传感器,是一个经济实用的方案。- o) B% n# H- t0 s
3 l. c- \' y/ w+ C$ \7 b# m
, O! \$ r5 K; U- N( z. B5 N" L5 R
( l0 @) b& C5 l+ J# ] 本方案采用RS232串口通讯方式来驱动VL53L1X。有关VL53L1X的详细资料请参考ST官方:
/ h! o. Z% o+ {3 E" Q: o/ m$ \https://www.stmcu.com.cn/Article ... ode/news/art_id/707
8 a3 K' q, @6 q" A+ X' q$ E/ w' g) Z6 r1 ]1 r/ d
硬件连接:
( j" N- O5 R) @( g/ p5 c3 i! n+ x; u
0 i: }4 ^6 e- S9 y# K- h# X
/ s" z$ p! r3 G! {) N使用Nucleo-F031的PA0、PA3、PA4来驱动OLED显示屏,PA9、PA10是USART1的TXD、RXD。串口波特率9600,8为数据位,1位停止位,无校验。中断方式接收。
0 ? t+ P/ E1 A: I" Y- Q& D6 B* H. P1 V
" G4 R X- u% ^! T
CubeMX的配置:
" A; ]( Z7 _: _+ j! D# g+ G
4 Q& e/ g" D% d \" e6 O k( S" w/ p- U" q7 |0 x6 O! X9 C. F
! z$ e; b M4 Y# f! F
运行结果! ]2 S! G( F) b4 E( C# G
8 j }- W1 }( s B* O
9 o. I# ~+ Z! S6 m3 y# K$ M9 E6 ~- q4 ]
主要代码:, {/ g! v( o$ ^& F( k: L
- % h4 e6 k% ^3 I/ B+ M2 X
- int main(void)* l$ z- e2 P% ]6 i- d
- {
; C$ [1 K$ q+ u! I - HAL_Init();
1 |- k, V% | a8 u' ]5 x) h, J; Y - SystemClock_Config();
) J5 e3 u/ P$ J - MX_GPIO_Init();
' f, ^" N) E+ a$ [* ^0 B - MX_USART1_UART_Init();
6 r. y4 Y! m$ u( w3 E - LCD_Init();6 ?+ {4 f: W! {4 |- f* Q3 v
- __HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);
- V0 q& N6 m+ K+ b0 B9 C& }2 G; ? - __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); 0 {: \9 H5 T, S) I. j% {- L
- __HAL_UART_CLEAR_IDLEFLAG(&huart1);
! M I V; b. c5 i - Tx_buf[0]=0xa5;
: D7 x! H9 m" | x) l/ D1 Q. Y0 B - Tx_buf[1]=0x45;
. z, b+ D+ r5 T& ?& x; D. y' h - Tx_buf[2]=0xea;
/ O' c3 H D, A# ~) ]1 N - HAL_UART_Transmit(&huart1,(uint8_t *)Tx_buf,3,0xffff);4 R% i8 v! ?( T/ u$ M- Z
- LCD_Print(20,0,"Nucleo-F031",TYPE16X16,TYPE8X16);
$ D3 f% m* w k4 |- s - LCD_Print(30,24,"激光测距",TYPE16X16,TYPE8X16);
3 ?3 m+ w7 x+ [+ l+ W3 I. w$ c - Disp_buf[2]='.';
6 w* @" h7 g0 f! x: ` - Disp_buf[4]=' ';/ U: Z2 a5 H5 q; s, X
- Disp_buf[5]='C';
) X6 g9 j" W9 n- p: l0 U - Disp_buf[6]='m';
' }! d, I4 S1 _$ O3 I1 f# n - Disp_buf[7]='\0';2 F0 z, q% v7 Z8 c
- while (1)# ^( q: O+ [0 j2 M
- {
* Q3 U- S3 |2 h$ a - bcdcode=HEX2BCD(Lenght);
% s$ @; b) D/ I. U - Disp_buf[0]=bcdcode%1000/100+0x30;
4 d1 V* u" V" g1 b5 ^ - Disp_buf[1]=bcdcode%100/10+0x30;# G+ ~: W( F3 T8 K
- Disp_buf[3]=bcdcode%10+0x30;: P+ L4 P# k8 S1 {+ ]
- LCD_Print(36,48,Disp_buf,TYPE16X16,TYPE8X16);; B: E1 i' t# ?$ G/ f: }# M
- HAL_Delay(200);, ?, r8 T' l! F* x
- }
6 x; l, j" b v/ n2 f& E - }
复制代码
+ Z5 v8 h2 L- J中断函数:- void USART1_IRQHandler(void)
! k c: Q1 T$ M" p5 T7 g - {
! C1 O1 R9 u6 }# R' @* W. o$ T - if((USART1->ISR & USART_ISR_RXNE) != RESET) + l/ E( S. y; H
- {
$ b5 p& R$ V. `/ r' D. L) ]# o% | - Rx_buf[RxCount++]=USART1->RDR;9 w3 _+ p6 ^ [0 k8 T/ z. f
- }, v. e# @ P! t7 S: [
. ~# r. \6 j9 p- if(RxCount==8)& B: c+ ^5 Q4 ^ T) Q/ \) v
- {
8 i. W- X/ f; ~6 n - Lenght=Rx_buf[4]<<8;) ]3 a! E3 F& ]6 W u, P
- Lenght |=Rx_buf[5];
- ^# R. O( r2 ]2 J# i3 U8 e7 {2 p - RxCount=0;
4 j0 N, W' _8 c+ l - } ) }3 ?9 u9 I' A7 c4 k
- HAL_UART_IRQHandler(&huart1);
4 ^6 f7 S3 p& p7 e3 e# ^$ Y9 S - }
复制代码 9 B' d2 x0 b+ q3 p
% q+ l( B9 _$ j% l, U- t" R
# C! V7 g; P3 K% K; k$ n; C1 H
6 N" ^9 h \: ~$ T M/ P2 J, b; R& G q9 B0 E& m
|