STM32CubeMX学习(二) USB CDC 双向通信

STM32CubeMX学习(二) USB CDC 双向通信

  • 简介
  • CubeMX新建工程(串口+LED)
  • 测试串口和LED
  • 串口接收
  • 测试USB CDC通信

简介

利用正点原子F407探索者开发板,测试基于USB CDC的双向数据通信。

CubeMX新建工程(串口+LED)

设置时钟源
在这里插入图片描述
在这里插入图片描述

设置调试器
在这里插入图片描述
设置LED
在这里插入图片描述
设置串口
在这里插入图片描述
设置USB OTG
在这里插入图片描述
在这里插入图片描述

Pinout预览
在这里插入图片描述
工程管理
在这里插入图片描述
在上图里,可以把Heap Size和Stack Size改大点,使得USB数据通信更流畅。

在这里插入图片描述
选中红框里的选项主要是为了工程打包后给他人直接使用。

最后点击GENERATE CODE生成工程。

测试串口和LED

usart.h中引入头文件stdio.h

/* USER CODE BEGIN Includes */
#include "stdio.h"	//引入此文件,为重定向printf
/* USER CODE END Includes */

usart.c中添加重定向代码

/* USER CODE BEGIN 1 */
// 重定向printf函数
int fputc(int ch,FILE *f)
{uint8_t temp[1]={ch};HAL_UART_Transmit(&huart1,temp,1,2);return 0;
}
/* USER CODE END 1 */

为了方便调试,在main.c中加入以下宏定义

/* USER CODE BEGIN PD */
#define USER_MAIN_DEBUG#ifdef USER_MAIN_DEBUG
#define user_main_printf(format, ...) printf( format "\r\n",##__VA_ARGS__)
#define user_main_info(format, ...)   printf("main.info:" format "\r\n",##__VA_ARGS__)
#define user_main_debug(format, ...)  printf("main.debug:" format "\r\n",##__VA_ARGS__)
#define user_main_error(format, ...)  printf("main.error:" format "\r\n",##__VA_ARGS__)
#else
#define user_main_printf(format, ...)
#define user_main_info(format, ...)
#define user_main_debug(format, ...)
#define user_main_error(format, ...)
#endif
/* USER CODE END PD */

main.c中添加代码

  /* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */printf("Enter main while loop!\r\n");user_main_debug("Main debug!\n");HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET);HAL_Delay(500);HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET);HAL_Delay(500);}/* USER CODE END 3 */

设置下载后自动运行,编译运行,连接串口调试助手,观察现象
在这里插入图片描述
编译下载后,重启发现LED1(绿灯)在闪烁,串口收到字符数据。

如果程序没有反应或者仿真后发现程序一直卡死在 BEAB BKPT 0xAB,解决方法:MDK选择设置,TARGET ,勾选Use MicroLIB
在这里插入图片描述

串口接收

在usbd_cdc_if.c中,有发送函数和接收函数。发送函数CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)不需要修改,接收函数CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)需要修改再使用。
在usbd_cdc_if.c中定义变量

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/unsigned char CDC_Receive_Buffer[64]; //数据缓冲区数组的大小可以根据你想要的收发的数据大小变更unsigned char CDC_Receive_Length;
/* USER CODE END PV */

修改CDC_Receive_FS函数

static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{/* USER CODE BEGIN 6 */memcpy(CDC_Receive_Buffer, Buf, *Len);CDC_Receive_Length = *Len;USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);USBD_CDC_ReceivePacket(&hUsbDeviceFS);return (USBD_OK);/* USER CODE END 6 */
}

测试USB CDC通信

main.c中,添加如下代码:

...
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "usart.h"
#include "usb_device.h"
#include "gpio.h"
...
/* USER CODE BEGIN PV */
unsigned char CDC_Transmit_Buffer[64] = {1,2,3,4,5,6,7,8,9,}; //USB发送缓存
unsigned char CDC_Transmit_Count = 0;//USB发送数据计数
extern unsigned char CDC_Receive_Buffer[]; 
extern unsigned char CDC_Receive_Length;
extern uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len);
/* USER CODE END PV */
...
int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_USART1_UART_Init();MX_USB_DEVICE_Init();while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */CDC_Transmit_FS(CDC_Transmit_Buffer, 64);HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET);HAL_Delay(500);CDC_Transmit_FS(CDC_Receive_Buffer,CDC_Receive_Length);HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET);HAL_Delay(500);}/* USER CODE END 3 */
}

编译后下载,点击发送按钮,测试结果如下图:
在这里插入图片描述

Bus Hound捕获情况如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/308847.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三路电源互备自投电路

当供电源停电时,主备用电源自动投入运行,当主备用电源断电时,则次备用电源自动投入运行,从而大大提高供电的可靠性。

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK设置相机的固定帧率(C#)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK设置相机的固定帧率(C#) Baumer工业相机Baumer工业相机的固定帧率功能的技术背景CameraExplorer如何查看相机固定帧率功能在NEOAPI SDK里通过函数设置相机固定帧率 Baumer工业相机通过NEOAPI SDK设置相机固…

人工智能——移动摄影技术

目录 封面 1 .移动计算摄影简介 2.手机相机的硬件限制 2.1 传感器尺寸和镜头孔径 2.2 噪声和动态范围 2.3 景深 2.4 变焦 2.5 色彩欠采样 3 .相机图像处理流水线 3.1 相机传感器 3.2 相机流水线 5.拓展 1 .移动计算摄影简介 现代数字摄影的进度始终伴随着图像传感器…

iPhone 13 Pro 更换『移植电芯』和『超容电池』体验

文章目录 考虑换电池Ⅰ 方案一Ⅱ 方案二 总结危险 Note系列地址 简 述: 首发买的iPhone 13P &#xff08;2021.09&#xff09;&#xff0c;随性使用一年出头&#xff0c;容量就暴跌 85%&#xff0c;对比朋友一起买的同款&#xff0c;还是95%。这已经基本得一天两充 >_<&a…

命令模式-举例

开关和电灯之间并不存在直接耦合关系&#xff0c;在命令模式中&#xff0c;发送者与接收者之间引入了新的命令对象&#xff0c;将发送者的请求封装在命令对象中&#xff0c;再通过命令对象来调用接收者的方法。 命令模式的主要缺点如下&#xff1a; 使用命令模式可能会导致某…

[足式机器人]Part4 南科大高等机器人控制课 CH12 Robotic Motion Control

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;CLEAR_LAB 笔者带更新-运动学 课程主讲教师&#xff1a; Prof. Wei Zhang 课程链接 &#xff1a; https://www.wzhanglab.site/teaching/mee-5114-advanced-control-for-robotics/ 南科大高等机器人控制课 Ch12 Robotic …

m3u8网络视频文件下载方法

在windows下&#xff0c;使用命令行cmd的命令下载m3u8视频文件并保存为mp4文件。 1.下载ffmpeg&#xff0c;访问FFmpeg官方网站&#xff1a;https://www.ffmpeg.org/进行下载 ffmpeg下载&#xff0c;安装&#xff0c;操作说明 https://blog.csdn.net/m0_53157282/article/det…

scanf函数返回值占位符详解,%*,%[]的应用

前言 scanf函数可以说是我们一开始就会接触的函数了&#xff0c;但在最近复习时我又找到而来一些之前不甚了解或是块要遗忘的知识&#xff0c;特作此篇。 一.返回值 我们之前提到了scanf返回值被忽略的问题&#xff1a; scanf函数返回值被忽略-CSDN博客 那么scanf的返回值…

PIC项目(9)——基于PIC16F877A的环境光照检测系统

1.课题背景 近年来&#xff0c;城市光污染问题逐渐显现。白天&#xff0c;玻璃幕墙、釉面砖墙、磨光大理石和各种涂料等装饰反射光线&#xff0c;明晃刺眼&#xff1b;夜晚&#xff0c;商场、酒店、超市楼顶的广告牌、电子屏、霓虹灯炫烂夺目。面对这样的光污染&#xff0c;人们…

关于Omlox定位标准(一)——omlox hub

关于Omlox定位标准 Omlox是世界上第一个开放的定位标准&#xff0c;旨在实现灵活的实时定位解决方案&#xff0c;&#xff0c;可以使用来自各个制造商的单元。“omlox"一词源自拉丁词汇"omni”&#xff08;无处不在&#xff09;和"locus"&#xff08;位置…

使用element中el-cascader级联选择器动态懒加载以及回显 (单选)

<template><!-- 新增||修改弹框 --><el-dialog :close-on-click-modal"false" :close-on-press-escape"false" :title"title" :visible.sync"open"width"800px" append-to-body><el-form ref"for…

仓库申请报错:Cannot access gated repo for url https://huggingface.co/api

这个报错主要是使用huggingface里面的仓库的模型或其他文件需要提供访问权利&#xff0c; 1.需要有自己的huggingface账号&#xff08;没有则创建&#xff09; 2.右上角点进个人中心&#xff0c;然后找到Access Tokens&#xff0c; 3.设置新的或者Tokens&#xff0c;设置为读…