一、使用的環(huán)境
硬件環(huán)境:
芯片STM32F103VET6,外部晶振8M,USB電路接口如下圖,USB做從設(shè)備時(shí),D+引腳要上拉到高電平,這里控制PA8引腳輸出低電平即可使能D+為高電平。
軟件環(huán)境:
代碼編輯和編譯軟件:RT-Thread Studio 1.1.2;RTOS:rt-thread4.0.2;Windows的串口驅(qū)動(dòng):VCP_V1.4.0_Setup.exe
二、移植修改過程
(一)基礎(chǔ)工程的創(chuàng)建
1.項(xiàng)目工程創(chuàng)建
選擇RT-Thread Studio的文件->新建->RT-Thread項(xiàng)目
2.選擇保存的目錄,選擇使用的芯片,選擇串口及引腳,選擇下載工具
3.生成的工程使用內(nèi)部時(shí)鐘(在drv_clk.c文件中),往串口輸出信息,這個(gè)工程可以直接編譯下載到芯片中校驗(yàn)工程的正確性。
(二)使用CubeMX生成時(shí)鐘配置和外設(shè)配置
1.在CubeMX中選擇使用的STM32F103VE芯片創(chuàng)建工程
2.選擇RCC項(xiàng)為外部高速時(shí)鐘為晶振;選擇USB項(xiàng)打開使能,選擇USB的IP包;設(shè)置時(shí)鐘頻率,主時(shí)鐘設(shè)置為73Mhz,USB時(shí)鐘設(shè)置為48Mhz,cubeMX自動(dòng)計(jì)算分頻系數(shù)。
3.設(shè)置工程選項(xiàng),生成工程代碼。
(三)RT-thread工程修改
1.時(shí)鐘配置修改
從CubeMX工程的main.c文件中拷貝SystemClock_Config函數(shù)的內(nèi)容覆蓋RT-Thred studio工程drv_clk.c文件中的SystemClock_Config函數(shù)中的內(nèi)容,讓時(shí)鐘能使用外部晶振。
2.進(jìn)行RTOS內(nèi)核配置,保存。
3.因?yàn)镾TM32F103的時(shí)鐘要單獨(dú)打開,在drv_clk.c文件中的SystemClock_Config函數(shù)中增加USB的時(shí)鐘使能,在stm32f1xx_hal_conf.h打開HAL庫的USB相關(guān)代碼編譯選項(xiàng)。
4.配置驅(qū)動(dòng)
打開rtconfig.h文件,在USB驅(qū)動(dòng)配置的地方增加USB設(shè)備的BSP定義選項(xiàng)和D+上拉電平控制引腳(從drv_gpio.c中按照對應(yīng)的管腳查到對應(yīng)的控制編號,如果D+已經(jīng)接到搞電平可以不用添加這個(gè)控制),修改USB_VENDOR_ID 為0x0483,修改USB_PRODUCT_ID為 0x5740(需改這兩項(xiàng)才可以使用ST提供的Windows虛擬串口驅(qū)動(dòng),否則設(shè)備被識別為其他設(shè)備)
5.main.c函數(shù)修改
/ 用于接收消息的信號量 /
static struct rt_semaphore rx_sem;
static rt_device_t serial;
/ 接收數(shù)據(jù)回調(diào)函數(shù) /
static rt_err_t uart_input(rt_device_t dev, rt_size_t size)
{
/ 串口接收到數(shù)據(jù)后產(chǎn)生中斷,調(diào)用此回調(diào)函數(shù),然后發(fā)送接收信號量 /
rt_sem_release(&rx_sem);
return RT_EOK;
}
static void serial_thread_entry(void parameter)
{
char ch;
while (1)
{
/ 從串口讀取一個(gè)字節(jié)的數(shù)據(jù),沒有讀取到則等待接收信號量 /
while (rt_device_read(serial, -1, &ch, 1) != 1)
{
/ 阻塞等待接收信號量,等到信號量后再次讀取數(shù)據(jù) /
rt_sem_take(&rx_sem, RT_WAITING_FOREVER);
}
/ 讀取到的數(shù)據(jù)通過串口錯(cuò)位輸出 */
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);
// 設(shè)置接收回調(diào)函數(shù)
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.測試收發(fā),串口工具要打開DTR控制
-
USB接口
+關(guān)注
關(guān)注
9文章
699瀏覽量
55538 -
RTOS
+關(guān)注
關(guān)注
21文章
809瀏覽量
119363 -
虛擬串口
+關(guān)注
關(guān)注
3文章
60瀏覽量
13855 -
RT-Thread
+關(guān)注
關(guān)注
31文章
1261瀏覽量
39843 -
STM32F103VET6
+關(guān)注
關(guān)注
12文章
18瀏覽量
15547
發(fā)布評論請先 登錄
相關(guān)推薦
評論