stm32USB LIB

cubeMX配置 时钟 中断 串口
在这里插入图片描述
串口配置:
在这里插入图片描述
串口开启dma传送
在这里插入图片描述
到此串口配置完成,程序中调用只需要使用:

HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

就可以向外部发送数据,例如自己实现的debug 函数

#define debug(...){\
	int len=0;\
	len=snprintf((char*)trans_buf,128,__VA_ARGS__);\
	if(len>0)\
	{\
		HAL_UART_Transmit_DMA(&huart1, (uint8_t*)trans_buf, len);\
	}\
}
//当然还可以实现一个自己的printf 函数 例如
#include <stdarg.h>
#include <stdstring.h>
unsigned char buffer[120]={0};//发送数据缓冲区大小
int stmPrintf(char *format, ...)
{
    va_list aptr;
    int ret;
    va_start(aptr, format);//从堆栈缓冲区中将数据取出来
    ret = vsprintf((char *)buffer, format, aptr);//格式化输出字符串
    va_end(aptr);
    if(ret>=0)//输出
        HAL_UART_Transmit_DMA(&huart1, buffer, ret);//通过DMA 将数据传出去
	return ret;
}

调用debug函数:
在这里插入图片描述
USB 配置,由于使用的是c8t6所以只有FS 模式
在这里插入图片描述
Middleware USB 配置,其他保持默认即可
在这里插入图片描述
PB12 LED 上拉 PB13KEY1 上拉开启中断:
在这里插入图片描述
在这里插入图片描述
时钟树配置:
在这里插入图片描述
最后生成工程:在这里插入图片描述
在这里插入图片描述
其他保持默认即可。
附:stlink 解决下载一次后不能使用的问题:
在这里插入图片描述
cubeMX配置完整工程:
在这里插入图片描述
hid mose 鼠标工程只需要更改usbd_hid.c 中HID_MOUSE_ReportDesc 数组,其向主机描述了鼠标有哪些按时间发送的数据报长等,该数据报文可以由:
在这里插入图片描述
HID 软件生成 ,具体可以参考HID 1.1 报文 协议:
在这里插入图片描述
例如以下:

#define HID_MOUSE_REPORT_DESC_SIZE 50
__ALIGN_BEGIN static uint8_t HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE]  __ALIGN_END =
{
    0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
    0x09, 0x02,                    // USAGE (Mouse)
    0xa1, 0x01,                    // COLLECTION (Application)
    0x09, 0x01,                    //   USAGE (Pointer)
    
    0xa1, 0x00,                    //   COLLECTION (Physical)
    0x05, 0x09,                    //     USAGE_PAGE (Button)
    0x19, 0x01,                    //     USAGE_MINIMUM (Button 1)
    0x29, 0x03,                    //     USAGE_MAXIMUM (Button 3)
    0x15, 0x00,                    //     LOGICAL_MINIMUM (0)
    0x25, 0x01,                    //     LOGICAL_MAXIMUM (1)
    0x95, 0x03,                    //     REPORT_COUNT (3)
    0x75, 0x01,                    //     REPORT_SIZE (1)
    0x81, 0x02,                    //     INPUT (Data,Var,Abs)
    0x95, 0x01,                    //     REPORT_COUNT (1)
    0x75, 0x05,                    //     REPORT_SIZE (5)
    0x81, 0x03,                    //     INPUT (Cnst,Var,Abs)
    0x05, 0x01,                    //     USAGE_PAGE (Generic Desktop)
    0x09, 0x30,                    //     USAGE (X)
    0x09, 0x31,                    //     USAGE (Y)
    0x15, 0x81,                    //     LOGICAL_MINIMUM (-127)
    0x25, 0x7f,                    //     LOGICAL_MAXIMUM (127)
    0x75, 0x08,                    //     REPORT_SIZE (8)
    0x95, 0x02,                    //     REPORT_COUNT (2)
    0x81, 0x06,                     //     INPUT (Data,Var,Rel)
    0xc0,
    0xc0,	
	
  
};

在这里插入图片描述
发送函数:

USBD_HandleTypeDef hUsbDeviceFS;//usb_device.c
uint8_t USBD_HID_SendReport(USBD_HandleTypeDef *pdev, //usb 设备 USBD_HandleTypeDef hUsbDeviceFS;
                            uint8_t *report,//发送数据指针
                            uint16_t len)//发送数据长度

如图我实现的发送函数:
在这里插入图片描述
然后通过按键就可以看到数鼠标状态改变了

参考资料连接:
https://download.csdn.net/download/u012850999/12021160

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32芯片内置USB控制器,可以通过USB接口与主机或其他设备进行通信。在使用USB通信之前,需要对STM32USB控制器进行配置和初始化。 下面是一个简单的STM32 USB通信的例程,实现了从主机接收数据并通过串口输出的功能: ```c #include "stm32f10x.h" #include "usb_lib.h" #include "usb_desc.h" #include "usb_pwr.h" #define USART_TX_GPIO_PORT GPIOA #define USART_TX_GPIO_CLK RCC_APB2Periph_GPIOA #define USART_TX_PIN GPIO_Pin_9 #define USART_RX_GPIO_PORT GPIOA #define USART_RX_GPIO_CLK RCC_APB2Periph_GPIOA #define USART_RX_PIN GPIO_Pin_10 void RCC_Configuration(void) { /* Enable GPIO clock */ RCC_APB2PeriphClockCmd(USART_TX_GPIO_CLK | USART_RX_GPIO_CLK, ENABLE); } void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; /* Configure USART Tx as alternate function push-pull */ GPIO_InitStructure.GPIO_Pin = USART_TX_PIN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(USART_TX_GPIO_PORT, &GPIO_InitStructure); /* Configure USART Rx as input floating */ GPIO_InitStructure.GPIO_Pin = USART_RX_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(USART_RX_GPIO_PORT, &GPIO_InitStructure); } void USART_Configuration(void) { USART_InitTypeDef USART_InitStructure; /* USART1 configuration ------------------------------------------------------*/ /* USART1 configured as follow: - BaudRate = 115200 baud - Word Length = 8 Bits - One Stop Bit - No parity - Hardware flow control disabled (RTS and CTS signals) - Receive and transmit enabled */ USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; /* Configure USART */ USART_Init(USART1, &USART_InitStructure); /* Enable USART */ USART_Cmd(USART1, ENABLE); } void USB_Configuration(void) { Set_USBClock(); USB_Interrupts_Config(); USB_Init(); } int main(void) { RCC_Configuration(); GPIO_Configuration(); USART_Configuration(); USB_Configuration(); while (1) { if (bDeviceState == CONFIGURED) { uint8_t buffer[64]; uint16_t length = USB_SIL_Read(EP1_OUT, buffer); if (length > 0) { USART_SendData(USART1, buffer[0]); while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); } } } } ``` 需要注意的是,这个例程中使用的是CDC(Communication Device Class)通信协议,因此需要在usb_desc.c文件中定义相应的描述符。同时,还需要实现一些回调函数,比如USB中断处理函数、USB数据发送函数等。 另外,需要在STM32CubeMX中进行一些配置,比如启用USB功能、配置PLL时钟等。具体的步骤可以参考ST官方文档或者相关的教程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值