為了讓RobomasterC板(這塊板用的是STM32F407IGHX的芯片)能與上位機(jī)進(jìn)行通訊。我最近翻了不少博客和CSDN文章,看到了很多文章存在一些問(wèn)題,經(jīng)過(guò)了一下午試錯(cuò),我成功實(shí)現(xiàn)了STM32F407IGHX利用STM32CubeIDE進(jìn)行配置并然后用HAL庫(kù)進(jìn)行編程,與安裝有ROS的Ubuntu進(jìn)行虛擬串口通信。
在翻看博客的時(shí)候我發(fā)現(xiàn),RM以及上下位機(jī)通信資料并不多,而且很多已有資料都只講述了實(shí)現(xiàn)原理,卻沒(méi)有講如何具體一步步實(shí)現(xiàn)某個(gè)功能,這就導(dǎo)致初學(xué)者可能在翻看過(guò)程中,越看越懵,反而寫不出一份能用的代碼。
所以這篇文章會(huì)盡可能詳細(xì)的講怎么實(shí)現(xiàn)串口通信,而盡量少講其原理,由于很多文章都已經(jīng)詳盡的寫出了串口通信的原理了,所以我就不在贅述原理而著重于實(shí)現(xiàn)過(guò)程。
此外,我也會(huì)把一些小問(wèn)題和建議寫出來(lái),以便一篇文章就解決所有可能存在的問(wèn)題。
一、概述
1、STM32端(所謂的下位機(jī)):這邊采用的是通過(guò)有圖形化的STM32CubeIDE配置工程,配置好USB-CDC創(chuàng)建一個(gè)虛擬串口,與上位機(jī)通信。
2、Ubuntu端(所謂的上位機(jī)):上位機(jī)是版本20.04的ubuntu,安裝有版本為noetic的ROS,通過(guò)建立一個(gè)ROS節(jié)點(diǎn)來(lái)打開串口并建立通信。
二、STM32端具體實(shí)現(xiàn)過(guò)程
思路:利用STM32CubeIDE配置好USB-CDC,接著修改對(duì)應(yīng)的頭文件,自定義所需的函數(shù)。
1、配置過(guò)程
1)先配置時(shí)鐘RCC,設(shè)置高速時(shí)鐘High Speed Clock為內(nèi)部時(shí)鐘(Crystal/Ceramic Resonator),另一個(gè)暫時(shí)用不到所以不設(shè)置。
2)配置下載與調(diào)試(必須設(shè)置,否則會(huì)鎖芯片,到時(shí)候還需要通過(guò)BOOT重啟,比較麻煩)
設(shè)置為Serial Wire,時(shí)鐘為SysTick(當(dāng)然看你到底有什么,如果你擁有的是ST-LINK,那么可以這樣設(shè)置)
3)設(shè)置USB模式,打開Connectivity,選擇USB-OYG-FS(快速),選擇Mode的Device_only(從機(jī)模式)。然后點(diǎn)開左下方的NVIC Settings,勾選Enabled,從而能夠開啟中斷。
備注:還要返回到NVIC中,設(shè)置USB中斷的優(yōu)先級(jí),這里設(shè)置個(gè)4就行(畢竟沒(méi)有啟動(dòng)其他外設(shè),所以中斷就不需要太嚴(yán)謹(jǐn))、
4)打開MiddleWare,設(shè)置USB的具體工作方式,選擇Class For FS IP的Communication Device Class,即VCP(虛擬串口),其余設(shè)置保持默認(rèn)即可,不需要額外修改。
5)時(shí)鐘樹設(shè)置(時(shí)鐘樹的設(shè)置,需要查閱所使用開發(fā)板的具體原理圖)
例如,RobomasterC板原理圖里是如此說(shuō)明的,所以Input frequency要設(shè)置成12MHz。此外,下方畫紅線部分是USB的時(shí)鐘,USB的時(shí)鐘需要設(shè)置成48MHz才能工作,其余部分看自己的需求。
6)堆棧設(shè)置,堆棧的大小需要足夠大,才能滿足USB初始化的需求,此處設(shè)置Heap Size為0X600即可解決初始化失敗的問(wèn)題,另一個(gè)不用改。
7)到此,所有的初始化已經(jīng)結(jié)束了,只需要Ctrl+s,保存并生成代碼即可,下方兩個(gè)選項(xiàng)均選擇Yes,即可生成STM32CubeIDE工程
2、代碼的修改
這里要先打開工程里的USB_DEVICE中的App的usbd_cdc_if.c,重構(gòu)官方給出的代碼,具體內(nèi)容如下
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file : usbd_cdc_if.c
* @version : v1.0_Cube
* @brief : Usb device for Virtual Com Port.
******************************************************************************
* @attention
*
* Copyright (c) 2023 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include 'usbd_cdc_if.h'
/* USER CODE BEGIN INCLUDE */
/* USER CODE END INCLUDE */
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
/* USER CODE END PV */
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
* @brief Usb device library.
* @{
*/
/** @addtogroup USBD_CDC_IF
* @{
*/
/** @defgroup USBD_CDC_IF_Private_TypesDefinitions USBD_CDC_IF_Private_TypesDefinitions
* @brief Private types.
* @{
*/
/* USER CODE BEGIN PRIVATE_TYPES */
/* USER CODE END PRIVATE_TYPES */
/**
* @}
*/
/** @defgroup USBD_CDC_IF_Private_Defines USBD_CDC_IF_Private_Defines
* @brief Private defines.
* @{
*/
/* USER CODE BEGIN PRIVATE_DEFINES */
/* USER CODE END PRIVATE_DEFINES */
/**
* @}
*/
/** @defgroup USBD_CDC_IF_Private_Macros USBD_CDC_IF_Private_Macros
* @brief Private macros.
* @{
*/
/* USER CODE BEGIN PRIVATE_MACRO */
/* USER CODE END PRIVATE_MACRO */
/**
* @}
*/
/** @defgroup USBD_CDC_IF_Private_Variables USBD_CDC_IF_Private_Variables
* @brief Private variables.
* @{
*/
/* Create buffer for reception and transmission */
/* It's up to user to redefine and/or remove those define */
/** Received data over USB are stored in this buffer */
uint8_t UserRxBufferFS[APP_RX_DATA_SIZE];
/** Data to send over USB CDC are stored in this buffer */
uint8_t UserTxBufferFS[APP_TX_DATA_SIZE];
/* USER CODE BEGIN PRIVATE_VARIABLES */
/* USER CODE END PRIVATE_VARIABLES */
/**
* @}
*/
/** @defgroup USBD_CDC_IF_Exported_Variables USBD_CDC_IF_Exported_Variables
* @brief Public variables.
* @{
*/
extern USBD_HandleTypeDef hUsbDeviceFS;
/* USER CODE BEGIN EXPORTED_VARIABLES */
/* USER CODE END EXPORTED_VARIABLES */
/**
* @}
*/
/** @defgroup USBD_CDC_IF_Private_FunctionPrototypes USBD_CDC_IF_Private_FunctionPrototypes
* @brief Private functions declaration.
* @{
*/
static int8_t CDC_Init_FS(void);
static int8_t CDC_DeInit_FS(void);
static int8_t CDC_Control_FS(uint8_t cmd, uint8_t* pbuf, uint16_t length);
static int8_t CDC_Receive_FS(uint8_t* pbuf, uint32_t *Len);
static int8_t CDC_TransmitCplt_FS(uint8_t *pbuf, uint32_t *Len, uint8_t epnum);
/* USER CODE BEGIN PRIVATE_FUNCTIONS_DECLARATION */
/* USER CODE END PRIVATE_FUNCTIONS_DECLARATION */
/**
* @}
*/
USBD_CDC_ItfTypeDef USBD_Interface_fops_FS =
{
CDC_Init_FS,
CDC_DeInit_FS,
CDC_Control_FS,
CDC_Receive_FS,
CDC_TransmitCplt_FS
};
/* Private functions ---------------------------------------------------------*/
/**
* @brief Initializes the CDC media low layer over the FS USB IP
* @retval USBD_OK if all operations are OK else USBD_FAIL
*/
static int8_t CDC_Init_FS(void)
{
/* USER CODE BEGIN 3 */
/* Set Application Buffers */
USBD_CDC_SetTxBuffer(&hUsbDeviceFS, UserTxBufferFS, 0);
USBD_CDC_SetRxBuffer(&hUsbDeviceFS, UserRxBufferFS);
return (USBD_OK);
/* USER CODE END 3 */
}
/**
* @brief DeInitializes the CDC media low layer
* @retval USBD_OK if all operations are OK else USBD_FAIL
*/
static int8_t CDC_DeInit_FS(void)
{
/* USER CODE BEGIN 4 */
return (USBD_OK);
/* USER CODE END 4 */
}
/**
* @brief Manage the CDC class requests
* @param cmd: Command code
* @param pbuf: Buffer containing command data (request parameters)
* @param length: Number of data to be sent (in bytes)
* @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL
*/
static int8_t CDC_Control_FS(uint8_t cmd, uint8_t* pbuf, uint16_t length)
{
/* USER CODE BEGIN 5 */
switch(cmd)
{
case CDC_SEND_ENCAPSULATED_COMMAND:
break;
case CDC_GET_ENCAPSULATED_RESPONSE:
break;
case CDC_SET_COMM_FEATURE:
break;
case CDC_GET_COMM_FEATURE:
break;
case CDC_CLEAR_COMM_FEATURE:
break;
/*******************************************************************************/
/* Line Coding Structure */
/*-----------------------------------------------------------------------------*/
/* Offset | Field | Size | Value | Description */
/* 0 | dwDTERate | 4 | Number |Data terminal rate, in bits per second*/
/* 4 | bCharFormat | 1 | Number | Stop bits */
/* 0 - 1 Stop bit */
/* 1 - 1.5 Stop bits */
/* 2 - 2 Stop bits */
/* 5 | bParityType | 1 | Number | Parity */
/* 0 - None */
/* 1 - Odd */
/* 2 - Even */
/* 3 - Mark */
/* 4 - Space */
/* 6 | bDataBits | 1 | Number Data bits (5, 6, 7, 8 or 16). */
上一篇:STM32微控制器的技術(shù)特點(diǎn)和性能指標(biāo)
下一篇:基于STM32單片機(jī)的防丟失手環(huán)系統(tǒng)設(shè)計(jì)
推薦閱讀最新更新時(shí)間:2025-07-04 02:54






設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- 神經(jīng)形態(tài)芯片可能是革新機(jī)器人實(shí)時(shí)電機(jī)控制的未來(lái)
- 從三個(gè)方面理解ARM嵌入式系統(tǒng)
- 自動(dòng)報(bào)警 基于MCU的家庭防盜報(bào)警系統(tǒng)的設(shè)計(jì)
- 存儲(chǔ)控制器及其訪問(wèn)外設(shè)的原理
- 基于51系列單片機(jī)的智能照明控制系統(tǒng)設(shè)計(jì)方案
- 基于STM32的四旋翼飛行器控制系統(tǒng)
- 單片機(jī)應(yīng)用編程技巧解析
- 基于89C52的教室智能節(jié)能照明系統(tǒng)設(shè)計(jì)
- 一種新型的雨量光照傳感器的設(shè)計(jì)
- 5V/8A同步反激式轉(zhuǎn)換器、符合IEEE 802.3bt標(biāo)準(zhǔn)的以太網(wǎng)供電(PoE)參考設(shè)計(jì)
- 使用 ON Semiconductor 的 STK750-010 的參考設(shè)計(jì)
- 使用 NXP Semiconductors 的 TDA8933 的參考設(shè)計(jì)
- A000074,帶有 PoE 的 Arduino 以太網(wǎng) Rev3 - 基于 ATmega328 8 位 ATmega AVR MCU 的開發(fā)套件
- LT3470HTS8 1.8V 降壓轉(zhuǎn)換器的典型應(yīng)用電路
- NCV33074DR2G 高順從電壓灌電流轉(zhuǎn)換器的典型應(yīng)用
- LT1170IQ、12V/5A 負(fù)至正降壓-升壓轉(zhuǎn)換器的典型應(yīng)用
- SESD1004Q4UG-0020-090、eSATA 使用 SESD1004Q4UG-0020-090 ESD 抑制二極管陣列的典型應(yīng)用 20kV 汽車 10 引腳 DFN
- NV706272R2DBDQGEVB:LIN ST Driver Stall SS 演示評(píng)估板
- EVAL-AD7891-1CBZ,用于單電源、12 位、454 kSPS ADC 的評(píng)估板
- ROHM推出“PFC+反激控制參考設(shè)計(jì)”,助力實(shí)現(xiàn)更小巧的電源設(shè)計(jì)!
- 實(shí)現(xiàn)自我溝通和與世界溝通的新方式
- 上汽集團(tuán)將推10萬(wàn)級(jí)半固態(tài)電池車型
- Bourns 推出其最小封裝尺寸 AEC-Q200 認(rèn)證車規(guī)級(jí)厚膜電阻
- 特斯拉大量使用激光雷達(dá)!
- 為何只有特斯拉采用PC芯片,而其他車企采用手機(jī)級(jí)車規(guī)芯片?
- 孚能科技:全固態(tài)電池進(jìn)入中試生產(chǎn)階段,計(jì)劃年底建成 0.2GWh 中試線
- 三星顯示獲梅賽德斯-邁巴赫S級(jí)48英寸OLED屏幕訂單
- Clearmotion全主動(dòng)懸掛系統(tǒng)將搭載保時(shí)捷,蔚來(lái)ET9已應(yīng)用
- R-SARC上車國(guó)產(chǎn)車型 京西智行讓智能底盤科技平權(quán)
- 機(jī)器人裝上感覺(jué)神經(jīng)模塊,讓機(jī)器人將變得“溫情脈脈”
- 中國(guó)工業(yè)機(jī)器人預(yù)計(jì)2018銷量將達(dá)到14.7萬(wàn)臺(tái),2020年有望突破35萬(wàn)臺(tái)
- 國(guó)內(nèi)最大深?!皺C(jī)器人”,最深能下潛3000米,可提起4噸重物
- 機(jī)器人逐漸代替我們工作,當(dāng)失業(yè)大潮席卷而來(lái)的時(shí)候,你準(zhǔn)備好了嗎
- 我國(guó)工業(yè)機(jī)器人高速發(fā)展,但關(guān)鍵技術(shù)較弱,產(chǎn)業(yè)應(yīng)用集中在中低端
- LPC54100 LPC54101 LPC54102 LPC541xx系列串口用法
- STM32F107 以太網(wǎng) + RL-TCPnet
- stm32f4 SD卡調(diào)試日志
- 工作問(wèn)題筆記-----STM32休眠問(wèn)題
- 工作問(wèn)題筆記-----STM32休眠問(wèn)題
- wince 下字符類型轉(zhuǎn)換問(wèn)題
- 有沒(méi)有誰(shuí)做過(guò)ELAN EMG2000開發(fā)的?
- 硬件工程師要具備哪些能力
- 數(shù)控直流恒流源鍵盤模塊設(shè)計(jì)
- UFUN初步程序調(diào)試及備注
- WINCE5.0編譯時(shí)提示找不到blddemo
- 想做一個(gè)全功能的USB設(shè)備
- 高價(jià)求wince4.2 5.0 arm平臺(tái)rm,rmvb播放軟件,自定義界面。
- 考考!對(duì)大家有益處,不用單片機(jī)和IC,用分離元件實(shí)現(xiàn)以下功能!
- 【 ST NUCLEO-H743ZI測(cè)評(píng)】+ LIS25BA數(shù)據(jù)采集