本文最后修改时间:2025年05月10日 01:57
一、本节简介
本节以树莓派pico2开发板为例,举例如何写一个USB虚拟串口的驱动加进工程里。
二、实验平台
1、硬件平台
1)树莓派pico2开发板
①树莓派pico2开发板(作为仿真器)
②micro usb数据线
2)电脑
3)香瓜RP2350目标板
2、软件平台
1)VS CODE
2)sscom5.13.1(串口工具)
三、版权声明
1)作者:甜甜的大香瓜
2)声明:喝水不忘挖井人,转载请注明出处。
3)纠错/业务合作:897503845@qq.com
4)香瓜嵌入式之树莓派群:512598061
5)本文出处:原创连载资料《简单粗暴学树莓派》
6)完整开源资料下载地址(电脑端打开):
四、实验前提
1、在进行本文步骤前,请先阅读以下章节:
1)《简单粗暴学树莓派》的“第一章至第二章”章节。
2、在进行本文步骤前,请先实现以下章节:
1)《简单粗暴学树莓派》的《香瓜树莓派RP2350之搭建开发环境(windows)》
2)《简单粗暴学树莓派》的《香瓜树莓派RP2350之新建工程》
五、硬件原理
1、硬件连接
实际只接了4根线,3.3V、GND、CLK、DIO
注意: 给pico2供电时接VSYS,是因为pico2会再经过稳压到3.3v供电给pico2目标板的rp2350。而香瓜使用的板子仿真接口是直接供电给rp2350的,所以需要直连3.3v。
2、原理图
RP2350的USB信号连接到板载的USB接口上
六、实验步骤
1、在VS CODE工程文件夹下,添加驱动GUA_USBtoUart.c(VS CODE会自动加载)
//********************************************************************** //name: GUA_USBtoUart.c //introduce: USB转串口驱动 //author: opengua //email: 897503845@qq.com //QQ group: 香瓜嵌入式之树莓派群(512598061) //shop: opengua.taobao.com //changetime: 2025.02.18 //********************************************************************** #include "pico/stdlib.h" #include "GUA_USBtoUart.h" #include "main.h" /*********************全局变量************************/ uint8_t gaGUA_USBtoUART_Rx_Buff[GUA_USB_TO_UART_RX_SIZE] = {0}; volatile uint8_t gGUA_USBtoUART_Rx_Length = 0; //必须加volatile,否则会被优化 /*********************内部函数************************/ static void GUA_Chars_Available_Callback(void* param); //********************************************************************** //name: GUA_Chars_Available_Callback //introduce: 回调函数 //parameter: none //return: none //author: opengua //email: 897503845@qq.com //QQ group: 香瓜嵌入式之树莓派群(512598061) //shop: opengua.taobao.com //changetime: 2025.02.18 //********************************************************************** static void GUA_Chars_Available_Callback(void* param) { int nGUA_Temp = 0; //记录接收数据前清零 gGUA_USBtoUART_Rx_Length = 0; //如果不读出数据会一直进中断;正常数据大于等于0,读完后则会返回负数 while((nGUA_Temp = getchar_timeout_us(100)) >= 0) { gaGUA_USBtoUART_Rx_Buff[gGUA_USBtoUART_Rx_Length] = nGUA_Temp; gGUA_USBtoUART_Rx_Length++; } //发送数据 //GUA_USBtoUart_Send(gaGUA_USBtoUART_Rx_Buff, gGUA_Length); //进入通信处理事件 gnGUA_Function = FUNC_GUA_COMMUNICAION_PROCESS_EVT; } //********************************************************************** //name: GUA_USBtoUart_Send //introduce: 初始化 //parameter: pGUA_Data:发送数据缓冲区 // nGUA_Len:数据长度 //return: none //author: opengua //email: 897503845@qq.com //QQ group: 香瓜嵌入式之树莓派群(512598061) //shop: opengua.taobao.com //changetime: 2025.02.18 //********************************************************************** void GUA_USBtoUart_Send(uint8_t *pGUA_Data, uint8_t nGUA_Len) { for(uint8_t i = 0; i<nGUA_Len; i++) { stdio_putchar_raw(pGUA_Data[i]); } } //********************************************************************** //name: GUA_USBtoUart_Init //introduce: 初始化 //parameter: none //return: none //author: opengua //email: 897503845@qq.com //QQ group: 香瓜嵌入式之树莓派群(512598061) //shop: opengua.taobao.com //changetime: 2025.02.18 //********************************************************************** //需要在CMakeLists.txt文件中打开usb(同时关闭串口为0):pico_enable_stdio_usb(ArgonOne_RP2350 1) void GUA_USBtoUart_Init(void) { //初始化usb转串口 这条不能被调用两次,避免低功耗唤醒后被再次初始化,所以这条放到GUA_Init函数外 //stdio_init_all(); //usb的回调函数,如果有想传入回调函数的变量可以从第二个形参传入 stdio_set_chars_available_callback(&GUA_Chars_Available_Callback, (void*)NULL); //打印 //printf("GUA_USBtoUart_Init ok\r\n"); } |
注意USB的回调函数里有香瓜的项目变量,添加后需要增删一些报错内容。
2、在VS CODE工程文件夹下,添加驱动GUA_USBtoUart.h(VS CODE会自动加载)
//********************************************************************** //name: GUA_USBtoUart.h //introduce: USB转串口驱动头文件 //author: opengua //email: 897503845@qq.com //QQ group: 香瓜嵌入式之树莓派群(512598061) //shop: opengua.taobao.com //changetime: 2025.02.18 //********************************************************************** #ifndef _GUA_USB_TO_UART_H_ #define _GUA_USB_TO_UART_H_ /*********************头文件************************/ #include <stdio.h> /*********************宏定义************************/ //串口缓冲区大小 #define GUA_USB_TO_UART_RX_SIZE 128 /*********************全局变量************************/ extern uint8_t gaGUA_USBtoUART_Rx_Buff[GUA_USB_TO_UART_RX_SIZE]; volatile extern uint8_t gGUA_USBtoUART_Rx_Length; /*********************外部函数************************/ extern void GUA_USBtoUart_Send(uint8_t *pGUA_Data, uint8_t nGUA_Len); extern void GUA_USBtoUart_Init(void); #endif |
3、添加对应驱动文件名称
4、打开USB开关、关闭串口开关(只能打开一个)
5、在应用层中调用
1)添加驱动头文件(main.c中)
#include "GUA_USBtoUart.h" |
2)添加驱动初始化代码1(main.c的main函数中)
//串口转USB初始化 GUA_USBtoUart_Init(); |
3)添加驱动初始化代码2(main.c的main函数中前面)
//初始化usb转串口 这条不能被调用两次,避免低功耗唤醒后被再次初始化,所以这条放到GUA_Init函数外 stdio_init_all(); |
七、实验结果
用USB连接设备和电脑,编译并仿真,全速运行。即可通过sscom5.13.1识别到串口了,可进行收发(需要修改USB回调函数)
因此实验成功。