版本
rt-thread5.1.0标准版
keil
stm32cubemax 6.12.1
stm32f205vet6
env 1.5.2
代码优化等级0
cherryusb v1.4.1
操作流程
1.使用cubemax配置usb,全速,仅设备,使能USB中断
2.配置usb device,选择虚拟串口CDC
3.添加usb后,时钟树需要重新配置。配置完成后,点击生成代码。
4.由于时钟配置发生变化,将cubemax生成的main.c中的时钟配置拷贝到board.c中,进行替换
5.使用env配置cherryusb,保存配置,执行pkgs --update更新软件包
Enable usb device mode
Select usb device speed(FS)
FS
Select usb device ip
dwc2_st
Enable usb cdc acm device
Select usb device template
cdc_acm
6.在软件版目录下,找到usb的配置文件,拷贝到工程目录下(为了方便直接拷贝到board目录下),并修改名称为usb_config.h
7.在env执行scons --target=mdk5,重新生成keil工程,将编译器修改为AC6,编译整个工程
8.在board.c文件中:(1)实现usb的底层初始化函数,将usbd_conf.c文件中void HAL_PCD_MspInit(PCD_HandleTypeDef* pcdHandle)和void HAL_PCD_MspDeInit(PCD_HandleTypeDef* pcdHandle)两个函数拷贝到board.c中,分别修改函数名为void usb_dc_low_level_init(uint8_t busid)和void usb_dc_low_level_deinit(uint8_t busid)。(2)添加中断处理函数。
void usb_dc_low_level_init(uint8_t busid)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* USER CODE BEGIN USB_OTG_FS_MspInit 0 */
/* USER CODE END USB_OTG_FS_MspInit 0 */
__HAL_RCC_GPIOA_CLK_ENABLE();
/**USB_OTG_FS GPIO Configuration
PA11 ------> USB_OTG_FS_DM
PA12 ------> USB_OTG_FS_DP
*/
GPIO_InitStruct.Pin = GPIO_PIN_11 | GPIO_PIN_12;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* Peripheral clock enable */
__HAL_RCC_USB_OTG_FS_CLK_ENABLE();
/* Peripheral interrupt init */
HAL_NVIC_SetPriority(OTG_FS_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(OTG_FS_IRQn);
/* USER CODE BEGIN USB_OTG_FS_MspInit 1 */
/* USER CODE END USB_OTG_FS_MspInit 1 */
}
void usb_dc_low_level_deinit(uint8_t busid)
{
/* USER CODE BEGIN USB_OTG_FS_MspDeInit 0 */
/* USER CODE END USB_OTG_FS_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_USB_OTG_FS_CLK_DISABLE();
/**USB_OTG_FS GPIO Configuration
PA11 ------> USB_OTG_FS_DM
PA12 ------> USB_OTG_FS_DP
*/
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11 | GPIO_PIN_12);
/* Peripheral interrupt Deinit*/
HAL_NVIC_DisableIRQ(OTG_FS_IRQn);
/* USER CODE BEGIN USB_OTG_FS_MspDeInit 1 */
/* USER CODE END USB_OTG_FS_MspDeInit 1 */
}
void OTG_FS_IRQHandler(void)
{
/* USER CODE BEGIN OTG_FS_IRQn 0 */
/* USER CODE END OTG_FS_IRQn 0 */
// HAL_PCD_IRQHandler(&hpcd_USB_OTG_FS);
extern void USBD_IRQHandler(uint8_t busid);
USBD_IRQHandler(0);
/* USER CODE BEGIN OTG_FS_IRQn 1 */
/* USER CODE END OTG_FS_IRQn 1 */
}
9.修改usb_config.h文件
/* 添加头文件 */
#include <rtthread.h>
/* 更换为rt-thread中的打印函数 */
#define CONFIG_USB_PRINTF(...) rt_kprintf(__VA_ARGS__)
/* 将CONFIG_USBDEV_EP_NUM由8修改为4 */
#ifndef CONFIG_USBDEV_EP_NUM
#define CONFIG_USBDEV_EP_NUM 4
#endif
10.在main.c文件中添加测试函数
int main(void)
{
extern void cdc_acm_init(uint8_t busid, uintptr_t reg_base);
cdc_acm_init(0, USB_OTG_FS_PERIPH_BASE);
while (1)
{
extern void cdc_acm_data_send_with_dtr_test(uint8_t busid);
cdc_acm_data_send_with_dtr_test(0);
rt_thread_mdelay(500);
}
return RT_EOK;
}
11.参照cubemax中的值修改VID和PID
12.编译程序,烧录代码,在设备管理器中可以看到USB被正确识别,在shell串口打印如下内容:
\ | /
- RT - Thread Operating System
/ | \ 5.1.0 build Nov 18 2024 18:53:53
2006 - 2024 Copyright by RT-Thread team
[I/USB] ========== dwc2 udc params ==========
[I/USB] CID:00001200
[I/USB] GSNPSID:4f54281a
[I/USB] GHWCFG1:00000000
[I/USB] GHWCFG2:229dcd20
[I/USB] GHWCFG3:020001e8
[I/USB] GHWCFG4:0ff08030
[I/USB] dwc2 fsphy type:1, hsphy type:0, dma support:0
[I/USB] dwc2 has 4 endpoints and dfifo depth(32-bit words) is 512, default config: 4 endpoints
[I/USB] =================================
msh >[I/USB] fifo0 size:0010, offset:0100
[I/USB] fifo1 size:0010, offset:0110
[I/USB] fifo2 size:0010, offset:0120
[I/USB] fifo3 size:0010, offset:0130
13.打开串口助手,选中usb串口,勾选DTR,打开串口,可以看到串口不断接收字节,并且在shell窗口中不断显示接收到字节。
14.资源占用
ROM : 56k -> 102K = 46k
RAM:7321 -> 7321 = 0