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