感謝論壇和得捷組織的本次活動,讓我們有機會可以接觸優(yōu)秀的硬件產品。
簡單的介紹一下本次的創(chuàng)意,想要實現(xiàn)一個簡易的實時流量測量工具,這里我們選用了一款基于超聲波的傳感器,稍后在進行簡單的介紹,主控的選擇確實一個難題,最基礎的功能就是需要進行顯示,當然了STM32是最理想的選擇,相對開發(fā)比較熟悉,最后通過不斷的篩選,STM32U083C-DK進入了而我的視線。
意法半導體STM32U083C-DK開發(fā)套件使用STM32U083MCT6微控制器演示和開發(fā)應用程序。意法半導體STM32U083C-DK是用于最終產品集成的用戶應用開發(fā)的參考設計。該板允許通過配備各種硬件功能來評估外設和創(chuàng)建應用程序。這些功能包括USB FS設備、分段LCD、觸摸鍵、溫度傳感器等。與Arduino Uno V3, microbus 和擴展連接器的兼容性簡化了連接到專用應用的擴展屏蔽或子板的連接。該套件具有集成的STLINK-V2EC調試器/編程器,消除了對單獨探頭的需要。通過標準的USB Type-A或USB Type-C 到USB Type-C電纜連接到PC,可以輕松操作該板。這里的分段式的LCD正式我們所需要的。
我們簡單看了一下其原理圖的分布:
最高可以顯示6位數,完全可以滿足我們的需求,當然了使用官方開發(fā)板還有一個好處就是有相關模塊驅動的歷程,我們直接使用其LCD_SegmentsDrive的歷程就可以實現(xiàn)基本的顯示功能,需要修改一些內容讓其符合我們的數字顯示需求,我們從寫一個顯示程序:
void BSP_LCD_GLASS_data(uint32_t Speed)
{
uint32_t repetition = 0;
uint8_t nbrchar = 0;
uint8_t str[6] = "";
uint8_t st1 = 0;
/* Reset interrupt variable in case key was press before entering function */
bLCDGlass_KeyPressed = 0;
repetition = Speed;
for(uint8_t i=0;i<6;i++)
{
if(repetition == 0)
{
if(i==0)
str[i] = 48;
else
str[i] = 32;
}
else
{
nbrchar = repetition%10;
str[i] = nbrchar+48;
repetition = repetition/10;
}
}
for(uint8_t j=0;j<3;j++)
{
st1 = str[j];
str[j] = str[5-j];
str[5-j] = st1;
}
BSP_LCD_GLASS_Clear();
BSP_LCD_GLASS_DisplayString(str);
}
接下來就是獲取流量相關的數據,我們使用的是一款超聲波流量傳感器,主要是使用串口通信,這樣一看是不是就不復雜了,硬件方面我們主要連接對應的串口就可以,我們選擇的串口二,對應的硬件座如下:
接下來是外設初始的配置,我們需要打開串口2:
由于收到的數據是一些列的字符串,為了減少中斷的占用,我們啟用的DMA:
采用串口空閑中斷+DMA的方式進行數據接收,這種方式非常適合不定長的串口數據接收。
接下來我們只要在外部中斷處理就可以了:
void USART2_LPUART2_IRQHandler(void)
{
/* USER CODE BEGIN USART2_LPUART2_IRQn 0 */
tmp_flag =__HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE); //獲取IDLE標志位
if((tmp_flag != RESET))
{
__HAL_UART_CLEAR_IDLEFLAG(&huart2);//
HAL_UART_DMAStop(&huart2);
Speed_Data = rx_buffer[5]*256+rx_buffer[5];
HAL_UARTEx_ReceiveToIdle_DMA(&huart2,rx_buffer,200);//再次開啟DMA接收
}
/* USER CODE END USART2_LPUART2_IRQn 0 */
HAL_UART_IRQHandler(&huart2);
/* USER CODE BEGIN USART2_LPUART2_IRQn 1 */
/* USER CODE END USART2_LPUART2_IRQn 1 */
}
測試效果如下:
斷碼顯示還是存在一定弊端的,對觀察角度的要求太苛刻。