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

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

简介

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

CubeMX新建工程(串口+LED)

设置时钟源

设置调试器

设置LED

设置串口

设置USB OTG

Pinout预览

工程管理

在上图里,可以把Heap Size和Stack Size改大点,使得USB数据通信更流畅。

选中红框里的选项主要是为了工程打包后给他人直接使用。

最后点击GENERATE CODE生成工程。

测试串口和LED

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

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

usart.c中添加重定向代码

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中加入以下宏定义

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中添加代码

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中定义变量

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函数

c 复制代码
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中,添加如下代码:

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捕获情况如下:

相关推荐
做cv的小昊1 分钟前
计算机图形学:【Games101】学习笔记05——着色(插值、高级纹理映射)与几何(基本表示方法)
笔记·opencv·学习·计算机视觉·图形渲染·几何学
车载测试工程师5 分钟前
CAPL学习-CAN相关函数-统计API函数
网络·网络协议·学习·capl·canoe
好奇龙猫1 小时前
【AI学习-comfyUI学习-第二十四节-open(contorlnet多重处理)+图生图openpose-各个部分学习】
人工智能·学习
一路往蓝-Anbo1 小时前
【第13期】中断机制详解 :从向量表到ISR
c语言·开发语言·stm32·单片机·嵌入式硬件
ArrebolJiuZhou2 小时前
00 arm开发环境的搭建
linux·arm开发·单片机·嵌入式硬件
易水寒陈2 小时前
使用J-Link RTT Viewer
stm32·单片机
wanzhong23332 小时前
CUDA学习5-矩阵乘法(共享内存版)
深度学习·学习·算法·cuda·高性能计算
少一倍的优雅3 小时前
hi3863(ws63)智能小车 (三)PWM驱动马达
单片机·嵌入式硬件·hi3863
xingzhemengyou13 小时前
STM32 内存空间中的选项字节
stm32·单片机
PNP Robotics4 小时前
PNP机器人受邀参加英业达具身智能活动
大数据·人工智能·python·学习·机器人