一、使用的環境
硬件環境:
芯片STM32F103VET6,外部晶振8M,USB電路接口如下圖,USB做從設備時,D+引腳要上拉到高電平,這里控制PA8引腳輸出低電平即可使能D+為高電平。
軟件環境:
代碼編輯和編譯軟件:RT-Thread Studio 1.1.2;RTOS:rt-thread4.0.2;Windows的串口驅動:VCP_V1.4.0_Setup.exe
二、移植修改過程
(一)基礎工程的創建
1.項目工程創建
選擇RT-Thread Studio的文件->新建->RT-Thread項目
2.選擇保存的目錄,選擇使用的芯片,選擇串口及引腳,選擇下載工具
3.生成的工程使用內部時鐘(在drv_clk.c文件中),往串口輸出信息,這個工程可以直接編譯下載到芯片中校驗工程的正確性。
(二)使用CubeMX生成時鐘配置和外設配置
1.在CubeMX中選擇使用的STM32F103VE芯片創建工程
2.選擇RCC項為外部高速時鐘為晶振;選擇USB項打開使能,選擇USB的IP包;設置時鐘頻率,主時鐘設置為73Mhz,USB時鐘設置為48Mhz,cubeMX自動計算分頻系數。
3.設置工程選項,生成工程代碼。
(三)RT-thread工程修改
1.時鐘配置修改
從CubeMX工程的main.c文件中拷貝SystemClock_Config函數的內容覆蓋RT-Thred studio工程drv_clk.c文件中的SystemClock_Config函數中的內容,讓時鐘能使用外部晶振。
2.進行RTOS內核配置,保存。
3.因為STM32F103的時鐘要單獨打開,在drv_clk.c文件中的SystemClock_Config函數中增加USB的時鐘使能,在stm32f1xx_hal_conf.h打開HAL庫的USB相關代碼編譯選項。
4.配置驅動
打開rtconfig.h文件,在USB驅動配置的地方增加USB設備的BSP定義選項和D+上拉電平控制引腳(從drv_gpio.c中按照對應的管腳查到對應的控制編號,如果D+已經接到搞電平可以不用添加這個控制),修改USB_VENDOR_ID 為0x0483,修改USB_PRODUCT_ID為 0x5740(需改這兩項才可以使用ST提供的Windows虛擬串口驅動,否則設備被識別為其他設備)
5.main.c函數修改
/ 用于接收消息的信號量 /
static struct rt_semaphore rx_sem;
static rt_device_t serial;
/ 接收數據回調函數 /
static rt_err_t uart_input(rt_device_t dev, rt_size_t size)
{
/ 串口接收到數據后產生中斷,調用此回調函數,然后發送接收信號量 /
rt_sem_release(&rx_sem);
return RT_EOK;
}
static void serial_thread_entry(void parameter)
{
char ch;
while (1)
{
/ 從串口讀取一個字節的數據,沒有讀取到則等待接收信號量 /
while (rt_device_read(serial, -1, &ch, 1) != 1)
{
/ 阻塞等待接收信號量,等到信號量后再次讀取數據 /
rt_sem_take(&rx_sem, RT_WAITING_FOREVER);
}
/ 讀取到的數據通過串口錯位輸出 */
rt_device_write(serial, 0, &ch, 1);
}
}
int main(void)
{
int count = 1;
int err = 0;
rt_thread_t tid;
char buf[] = “hello rt-thread!rn”;
serial = rt_device_find(“vcom”);
if (!serial)
{
rt_kprintf(“find failed!n”);
return RT_ERROR;
}
err = rt_device_init(serial);
if (!serial)
{
rt_kprintf(“find failed!n”);
return RT_ERROR;
}
err = rt_device_open(serial, RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX);
//初始化信號量
rt_sem_init(&rx_sem, "rx_sem", 0, RT_IPC_FLAG_FIFO);
// 設置接收回調函數
rt_device_set_rx_indicate(serial, uart_input);
rt_thread_t thread = rt_thread_create("serial", serial_thread_entry, RT_NULL, 1024, 25, 10);
if (thread != RT_NULL)
{
rt_thread_startup(thread);
}
while (count++)
{
rt_device_write(serial, 0, buf, rt_strlen(buf));
LOG_D("Hello RT-Thread!");
rt_thread_mdelay(1000);
}
return RT_EOK;
}
5.測試收發,串口工具要打開DTR控制
-
USB接口
+關注
關注
9文章
703瀏覽量
55850 -
RTOS
+關注
關注
22文章
820瀏覽量
119915 -
虛擬串口
+關注
關注
3文章
62瀏覽量
13945 -
RT-Thread
+關注
關注
31文章
1306瀏覽量
40423 -
STM32F103VET6
+關注
關注
12文章
18瀏覽量
15678
發布評論請先 登錄
相關推薦
RT-thread STM32F103 USB虛擬串口移植修改過程
RT-Thread STM32 配置指南
![<b class='flag-5'>RT-Thread</b> <b class='flag-5'>STM32</b> <b class='flag-5'>配置</b>指南](https://file.elecfans.com/web2/M00/49/B9/pYYBAGKhvFSAc4NDAAA-zh6B3V8383.png)
記錄——基于 RT-Thread 實現 USB 虛擬串口
![記錄——基于 <b class='flag-5'>RT-Thread</b> 實現 <b class='flag-5'>USB</b> <b class='flag-5'>虛擬</b><b class='flag-5'>串口</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
RT-Thread Studio 實現USB虛擬串口/STM32開發板
![<b class='flag-5'>RT-Thread</b> Studio 實現<b class='flag-5'>USB</b><b class='flag-5'>虛擬</b><b class='flag-5'>串口</b>/<b class='flag-5'>STM32</b>開發板](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
RT-Thread STM32 配置系統時鐘(使用外部晶振)
![<b class='flag-5'>RT-Thread</b> <b class='flag-5'>STM32</b> <b class='flag-5'>配置</b>系統時鐘(使用外部晶振)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
筆記:基于RT-thread初步了解rtos,利用Keil 模擬器 STM32F103 上手指南。
![筆記:基于<b class='flag-5'>RT-thread</b>初步了解rtos,利用Keil 模擬器 <b class='flag-5'>STM32F103</b> 上手指南。](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
基于 Keil MDK 移植 RT-Thread Nano
![基于 Keil MDK 移植 <b class='flag-5'>RT-Thread</b> Nano](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
基于 RT-Thread 在 STM32 上實現 USB 虛擬串口
![基于 <b class='flag-5'>RT-Thread</b> 在 <b class='flag-5'>STM32</b> 上實現 <b class='flag-5'>USB</b> <b class='flag-5'>虛擬</b><b class='flag-5'>串口</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
基于 RT-Thread 在 STM32 上實現 USB 虛擬串口
![基于 <b class='flag-5'>RT-Thread</b> 在 <b class='flag-5'>STM32</b> 上實現 <b class='flag-5'>USB</b> <b class='flag-5'>虛擬</b><b class='flag-5'>串口</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論